我有以下载体
video_132.shape
Out[64]: (64, 3)
我将添加三个值的新3D矢量
video_146[1][146][45]
这样
video_146[1][146][45].shape
Out[68]: (3,)
和
video_146[1][146][45]
Out[69]: array([217, 207, 198], dtype=uint8)
当我做以下
时np.append(video_132,video_146[1][146][45])
我应该得到
video_132.shape
Out[64]: (65, 3) # originally (64,3)
但是我得到:
Out[67]: (195,) # 64*3+3=195
它似乎使矢量变平了
如何通过保留3D结构来进行追加?
答案 0 :(得分:1)
为简单起见,我们重命名video_132
- > a
和video_146[1][146][45]
- > b
。特定值并不重要,所以我们说
In [82]: a = np.zeros((64, 3))
In [83]: b = np.ones((3,))
然后,我们可以使用以下内容将b
附加到a
In [84]: np.concatenate([a, b[None, :]]).shape
Out[84]: (65, 3)
由于np.concatenate
会返回一个新数组,请将其返回值重新分配给a
,以“追加”b
到a
:
a = np.concatenate([a, b[None, :]])
答案 1 :(得分:1)
append
的代码:
def append(arr, values, axis=None):
arr = asanyarray(arr)
if axis is None:
if arr.ndim != 1:
arr = arr.ravel()
values = ravel(values)
axis = arr.ndim-1
return concatenate((arr, values), axis=axis)
请注意,如果没有提供轴,arr
为raveled
In [57]: np.append(np.ones((2,3)),2)
Out[57]: array([1., 1., 1., 1., 1., 1., 2.])
append
的目的很简单,例如在1d数组中添加标量:
In [58]: np.append(np.arange(3),6)
Out[58]: array([0, 1, 2, 6])
否则行为很难预测。
concatenate
是基本操作(内置)并采用列表,而不仅仅是两个。因此,我们可以在一个列表中收集许多数组(或列表),并在循环结束时执行一个concatenate
。而且由于它没有预先调整尺寸,它迫使我们自己做。
因此,要将形状(3,)添加到(64,3),我们将(3,)转换为(1,3)。如果我们指定轴,则append
需要与concatenate
相同的维度调整。
In [68]: np.append(arr,b[None,:], axis=0).shape
Out[68]: (65, 3)
In [69]: np.concatenate([arr,b[None,:]], axis=0).shape
Out[69]: (65, 3)