将行追加到NumPy数组

时间:2016-03-24 22:22:11

标签: python numpy

在Python中,我想创建一个n-by-100矩阵,其中n的值在开始时是未知的。此创建涉及连续向矩阵添加行。我为此尝试的代码是:

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. 当我连续追加这样的行时,似乎我一直在制作原始数组的副本,随着数组的增长,这将是低效的。当我不知道最终数组的大小是什么时,还有其他方法吗?

  4. 谢谢!

2 个答案:

答案 0 :(得分: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)

还可以查看vstackhstackdstack

但更好的是,使用list append

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]])

答案 1 :(得分:0)

第一个问题的一种可能的解决方案是,您可以利用np.delete删除第一行(因为它仅包含零)。尽管我的解决方案不能解决您的整个问题,但对于一些正面临您问题的第一部分的人可能会有所帮助。