在numpy中将2d数组附加到1d数组

时间:2018-03-30 02:27:14

标签: python numpy

我有一个空的numpy数组现在我想追加一个2d数组

ac

但我想要>>> import numpy as np >>> a = np.array([]) >>> b = np.array([[1, 2], [3, 4]]) >>> np.append(a, b) array([1, 2, 3, 4])

2 个答案:

答案 0 :(得分:0)

以下是将'empty`数组与2d数组连接的两种方法,生成一个看起来与原始数组相似的新数组:

In [123]: b = np.array([[1, 2], [3, 4]])
In [124]: b.shape
Out[124]: (2, 2)
In [125]: np.concatenate((np.zeros((2,0),int),b),axis=1)
Out[125]: 
array([[1, 2],
       [3, 4]])
In [126]: _.shape
Out[126]: (2, 2)

In [127]: np.concatenate((np.zeros((0,2),int),b),axis=0)
Out[127]: 
array([[1, 2],
       [3, 4]])

关于尺寸匹配数量和非连接形状匹配的通常规则适用。另请注意dtype

appendvstackhstack摆弄形状,然后concatenate。最好了解如何直接使用concatenate

但是有人可能会问,为什么要进行所有这些连接工作,只产生一个匹配的数组? b.copy()更简单。

如果这是循环的开始,请不要。使用list append构建一个数组列表,然后在最后连接一次。 concatenate获取数组列表。 np.append只需要2个输入,并以不同方式对待它们。我不赞成使用它。

修改

你是否认真想要3D结果而不是2d?

In [128]: np.array([[[1, 2], [3, 4]]])
Out[128]: 
array([[[1, 2],
        [3, 4]]])
In [129]: _.shape
Out[129]: (1, 2, 2)

我撰写的关于匹配维度的concatenate的内容仍然适用。例如,创建一个具有正确形状的“空”(0,2,2)并将b展开为(1,2,2)

In [130]: np.concatenate((np.zeros((0,2,2),int),b[None,...]),axis=0)
Out[130]: 
array([[[1, 2],
        [3, 4]]])

b[None,...]是(1,2,2),所以不需要连接任何东西。

有一个np.stack,它为所有输入数组添加一个维度,然后连接。但我不知道这可以在这里适用。唯一可以添加到带有堆栈的(2,2)数组的是另一个(2,2)数组。

答案 1 :(得分:0)

以下是一种使其有效的方法:

# start with zero layers of the right shape:
>>> a = np.empty((0, 2, 2), int)
>>> a
array([], shape=(0, 2, 2), dtype=int64)
>>> b = np.arange(1, 5).reshape(2, 2)
>>> b
array([[1, 2],
       [3, 4]])
# use np.r_ instead of append the spec string '0,3,1' means concatenate
# along axis 0, make everything 3D, operands with fewer than 3
# get 1 axis added on the left
>>> np.r_['0,3,1', a, b]
array([[[1, 2],
        [3, 4]]])