2016-03-24 68 views
0

在Python中,我想要创建一个n-by-100矩阵,其中n的值在开始时未知。这种创建涉及在矩阵中连续添加一行。我已经尝试了这种代码是:将行附加到NumPy数组

x = numpy.zeros(100) 
while true: 
    y = loadrow(); # Load a 1-by-100 NumPy array for the new row 
    x = numpy.append(x, y, 0) 

然而,有三个问题与上面,这我有困难解决:

  1. 线x = numpy.zeros(100)初始化的矩阵的行100个零。但是,我希望第一行成为我加载的第一行。如何创建一个空矩阵,只有在追加第一行时才会给出数据?

  2. 该行x = numpy.append(x, y, 0)不会向矩阵x添加另一行。相反,它只是在第一行的末尾添加y,以创建更长的行。但如果我尝试x = numpy.append(x, y, 1),这样我追加到轴1,那么我得到的错误:TypeError: Required argument 'object' (pos 1) not found

  3. 当我连续追加这样的行时,似乎我一直在制作原始数组的副本,而随着数组的增长,效率会很低。当我不知道最终数组的大小是什么时,有没有其他方法可以做到这一点?

谢谢!

+0

请参阅我的回答类似的问题[这里](http://stackoverflow.com/questions/35818395/add-a-column-在-A-numpy的阵列-蟒/ 35828879#35828879)。 – bunji

+1

考虑使用列表,并在循环后,将其转换为numpy数组。 – Evert

回答

3

如果必须使用np.append这里有一个办法做到这一点

In [96]: arr=np.zeros((0,5),int) 

In [97]: for i in range(3): 
    arr=np.append(arr,np.arange(i,i+5).reshape(1,5),0) 
    ....:  

In [98]: arr 
Out[98]: 
array([[0, 1, 2, 3, 4], 
     [1, 2, 3, 4, 5], 
     [2, 3, 4, 5, 6]]) 

坦白说,我不喜欢append。人们会将它与列表追加混淆(你没有),人们不理解维度,并且每次都重建数组。

看看它的代码 - 看看它干了什么?

return concatenate((arr, values), axis=axis) 

另请参阅vstack, hstackdstack

但更好的是,使用列表追加

In [100]: alist=[] 

In [101]: for i in range(3): 
    alist.append(np.arange(i,i+5).reshape(1,5)) 
    .....:  

In [102]: np.concatenate(alist,axis=0) 
Out[102]: 
array([[0, 1, 2, 3, 4], 
     [1, 2, 3, 4, 5], 
     [2, 3, 4, 5, 6]])