如何将numpy.array追加到其他numpy.array?

时间:2015-05-08 11:15:21

标签: python arrays numpy

我想创建2D numpy.array只知道它的形状,即shape=2。现在,我想在for循环i中创建一维numpy.array,并将它们添加到shape=2的主矩阵中,这样我就可以得到类似的内容:

matrix=
[numpy.array 1]
[numpy.array 2]
...
[numpy.array n]

我怎样才能实现这一目标?我尝试使用:

matrix = np.empty(shape=2)
for i in np.arange(100):
    array = np.zeros(random_value)
    matrix = np.append(matrix, array)

但是作为print(np.shape(matrix))的结果,循环之后,我得到了类似的东西:

(some_number, )

如何将每个新array附加到matrix的下一行?提前谢谢。

3 个答案:

答案 0 :(得分:2)

我建议使用list

matrix = []

for i in range(10):
    a = np.ones(2)
    matrix.append(a)

matrix = np.array(matrix)
每次使用追加时,

列表都没有被复制到内存中的缺点。所以你避免了ali_m描述的问题。在操作结束时,您只需将列表对象转换为numpy数组。

答案 1 :(得分:1)

我怀疑你问题的根源是np.empty(shape=2)

中'shape'的含义

如果我运行代码的小版本

matrix = np.empty(shape=2)
for i in np.arange(3):
    array = np.zeros(3)
    matrix = np.append(matrix, array)

我得到了

array([  9.57895902e-259,   1.51798693e-314,   0.00000000e+000,
     0.00000000e+000,   0.00000000e+000,   0.00000000e+000,
     0.00000000e+000,   0.00000000e+000,   0.00000000e+000,
     0.00000000e+000,   0.00000000e+000])

一开始看那两个奇数?这些是np.empty(shape=2)生成的。 matrix(2,)形状的数组开始,而不是空的2d数组。 append只会为其添加3个零,从而产生(11,)数组。

现在,如果你开始使用具有正确列数的2数组,并且在第一维上连接,那么你将得到一个多行数组。 (行只有2d或更大的含义)。

mat=np.zeros((1,3))
for i in range(1,3):
    mat = np.concatenate([mat, np.ones((1,3))*i],axis=0)

产生

array([[ 0.,  0.,  0.],
       [ 1.,  1.,  1.],
       [ 2.,  2.,  2.]])

像这样进行迭代构造的更好方法是使用list append

alist = []
for i in range(0,3):
    alist.append(np.ones((1,3))*i)
mat=np.vstack(alist)

alist是:

[array([[ 0.,  0.,  0.]]), array([[ 1.,  1.,  1.]]), array([[ 2.,  2.,  2.]])]

mat

array([[ 0.,  0.,  0.],
       [ 1.,  1.,  1.],
       [ 2.,  2.,  2.]])

使用vstack,您可以使用np.ones((3,),因为它将所有输入转换为2d数组。

append可以使用,但它还需要axis=0个参数和2个数组。它被滥用,通常被错误地类比为列表追加。它只是concatenate的另一个前端。所以我不想使用它。

请注意,其他海报假设您的random value在迭代期间发生了变化。这将产生不同长度的阵列。对于1d追加仍然会产生长1d数组。但是2d追加不起作用,因为2d阵列不能被破坏。

mat = np.zeros((2,),int)
for i in range(4):
    mat=np.append(mat,np.ones((i,),int)*i)
# array([0, 0, 1, 2, 2, 3, 3, 3])

答案 2 :(得分:0)

您正在寻找的功能是np.vstack

以下是您的示例

的修改版本
import numpy as np

matrix = np.empty(shape=2)

for i in np.arange(3):
    array = np.zeros(2)
    matrix = np.vstack((matrix, array))

结果是

array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])