如何延长 numpy 数组的最后一个维度并用另一个数组填充它?
How to length the last dimension of a numpy array and fill it up with another array?
我有一个形状为 (5, 4, 3)
的 numpy 数组和另一个形状为 (4,)
的 numpy 数组,我想做的是扩展第一个数组的最后一个维度
(5, 4, 3) -> (5, 4, 4)
然后广播另一个形状为 (4,)
的数组,使其分别填满新的数组单元格。
示例:
np.ones((5,4,3))
array([[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]])
变成
array([[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]],
[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]],
[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]],
[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]],
[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]]])
然后我有另一个数组
array([2., 3., 4., 5.])
我以某种方式用第一个广播来填充零:
array([[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]]])
我怎样才能做到这一点?
您可以使用 numpy.c_
and numpy.tile
:
A = np.ones((5,4,3), dtype='int')
B = np.array([2, 3, 4, 5])
np.c_[A, np.tile(B[:,None], (A.shape[0], 1, 1))]
输出:
array([[[1, 1, 1, 2],
[1, 1, 1, 3],
[1, 1, 1, 4],
[1, 1, 1, 5]],
[[1, 1, 1, 2],
[1, 1, 1, 3],
[1, 1, 1, 4],
[1, 1, 1, 5]],
[[1, 1, 1, 2],
[1, 1, 1, 3],
[1, 1, 1, 4],
[1, 1, 1, 5]],
[[1, 1, 1, 2],
[1, 1, 1, 3],
[1, 1, 1, 4],
[1, 1, 1, 5]],
[[1, 1, 1, 2],
[1, 1, 1, 3],
[1, 1, 1, 4],
[1, 1, 1, 5]]])
工作原理:
# reshape B to add one dimension
>>> B[:, None]
array([[2],
[3],
[4],
[5]])
# tile to match A's first dimension
>>> np.tile(B[:,None], (A.shape[0], 1, 1))
array([[[2],
[3],
[4],
[5]],
[[2],
[3],
[4],
[5]],
[[2],
[3],
[4],
[5]],
[[2],
[3],
[4],
[5]],
[[2],
[3],
[4],
[5]]])
您可以使用 numpy.append :
A=np.ones((5,4,3))
AA=np.zeros((5,4,1))
B=np.array([2., 3., 4., 5.])
C=np.append(A,AA, axis=2)
for i in range(np.shape(C)[0]):
for j in range(np.shape(C)[1]):
C[i,j,-1]=B[j]
print(C)
>
[[[1. 1. 1. 2.]
[1. 1. 1. 3.]
[1. 1. 1. 4.]
[1. 1. 1. 5.]]
[[1. 1. 1. 2.]
[1. 1. 1. 3.]
[1. 1. 1. 4.]
[1. 1. 1. 5.]]
[[1. 1. 1. 2.]
[1. 1. 1. 3.]
[1. 1. 1. 4.]
[1. 1. 1. 5.]]
[[1. 1. 1. 2.]
[1. 1. 1. 3.]
[1. 1. 1. 4.]
[1. 1. 1. 5.]]
[[1. 1. 1. 2.]
[1. 1. 1. 3.]
[1. 1. 1. 4.]
[1. 1. 1. 5.]]]
有多种方法可以做到这一点,但最简单的方法之一是制作一个具有所需最终大小的数组,然后填写值。
我可以从 np.zeros((5,4,4))
开始,然后插入 np.ones((5,4,3))
,但为什么不从所有开始:
In [680]: res = np.ones((5,4,4))
我们可以轻松地将 4 元素 list/array 复制到最后一列:
In [681]: res[:,:,-1] = [2,3,4,5]
In [682]: res
Out[682]:
array([[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
...
(4,) 形状数组是 broadcasted
到 (1,4),这很容易适合 res[:,:,-1]
定义的 (5,4)
槽。
将 (4,) 扩展为 (5,4,1)(使用 tile
),然后将其与 (5,4,3) 连接也有效。
我有一个形状为 (5, 4, 3)
的 numpy 数组和另一个形状为 (4,)
的 numpy 数组,我想做的是扩展第一个数组的最后一个维度
(5, 4, 3) -> (5, 4, 4)
然后广播另一个形状为 (4,)
的数组,使其分别填满新的数组单元格。
示例:
np.ones((5,4,3))
array([[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]])
变成
array([[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]],
[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]],
[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]],
[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]],
[[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.],
[1., 1., 1., 0.]]])
然后我有另一个数组
array([2., 3., 4., 5.])
我以某种方式用第一个广播来填充零:
array([[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]]])
我怎样才能做到这一点?
您可以使用 numpy.c_
and numpy.tile
:
A = np.ones((5,4,3), dtype='int')
B = np.array([2, 3, 4, 5])
np.c_[A, np.tile(B[:,None], (A.shape[0], 1, 1))]
输出:
array([[[1, 1, 1, 2],
[1, 1, 1, 3],
[1, 1, 1, 4],
[1, 1, 1, 5]],
[[1, 1, 1, 2],
[1, 1, 1, 3],
[1, 1, 1, 4],
[1, 1, 1, 5]],
[[1, 1, 1, 2],
[1, 1, 1, 3],
[1, 1, 1, 4],
[1, 1, 1, 5]],
[[1, 1, 1, 2],
[1, 1, 1, 3],
[1, 1, 1, 4],
[1, 1, 1, 5]],
[[1, 1, 1, 2],
[1, 1, 1, 3],
[1, 1, 1, 4],
[1, 1, 1, 5]]])
工作原理:
# reshape B to add one dimension
>>> B[:, None]
array([[2],
[3],
[4],
[5]])
# tile to match A's first dimension
>>> np.tile(B[:,None], (A.shape[0], 1, 1))
array([[[2],
[3],
[4],
[5]],
[[2],
[3],
[4],
[5]],
[[2],
[3],
[4],
[5]],
[[2],
[3],
[4],
[5]],
[[2],
[3],
[4],
[5]]])
您可以使用 numpy.append :
A=np.ones((5,4,3))
AA=np.zeros((5,4,1))
B=np.array([2., 3., 4., 5.])
C=np.append(A,AA, axis=2)
for i in range(np.shape(C)[0]):
for j in range(np.shape(C)[1]):
C[i,j,-1]=B[j]
print(C)
>
[[[1. 1. 1. 2.]
[1. 1. 1. 3.]
[1. 1. 1. 4.]
[1. 1. 1. 5.]]
[[1. 1. 1. 2.]
[1. 1. 1. 3.]
[1. 1. 1. 4.]
[1. 1. 1. 5.]]
[[1. 1. 1. 2.]
[1. 1. 1. 3.]
[1. 1. 1. 4.]
[1. 1. 1. 5.]]
[[1. 1. 1. 2.]
[1. 1. 1. 3.]
[1. 1. 1. 4.]
[1. 1. 1. 5.]]
[[1. 1. 1. 2.]
[1. 1. 1. 3.]
[1. 1. 1. 4.]
[1. 1. 1. 5.]]]
有多种方法可以做到这一点,但最简单的方法之一是制作一个具有所需最终大小的数组,然后填写值。
我可以从 np.zeros((5,4,4))
开始,然后插入 np.ones((5,4,3))
,但为什么不从所有开始:
In [680]: res = np.ones((5,4,4))
我们可以轻松地将 4 元素 list/array 复制到最后一列:
In [681]: res[:,:,-1] = [2,3,4,5]
In [682]: res
Out[682]:
array([[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
[[1., 1., 1., 2.],
[1., 1., 1., 3.],
[1., 1., 1., 4.],
[1., 1., 1., 5.]],
...
(4,) 形状数组是 broadcasted
到 (1,4),这很容易适合 res[:,:,-1]
定义的 (5,4)
槽。
将 (4,) 扩展为 (5,4,1)(使用 tile
),然后将其与 (5,4,3) 连接也有效。