Numpy附加3D矢量而不展平

时间:2018-02-21 18:38:53

标签: python-3.x numpy append

我有以下载体

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结构来进行追加?

2 个答案:

答案 0 :(得分:1)

为简单起见,我们重命名video_132 - > avideo_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,以“追加”ba

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)

请注意,如果没有提供轴,arrraveled

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)