在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)
但是,上面有三个问题,我很难解决:
行x = numpy.zeros(100)
用一行100个零来初始化矩阵。但是,我希望第一行是我加载的第一行。如何创建一个空矩阵,只有在我追加第一行时才会给出数据?
行x = numpy.append(x, y, 0)
不会向矩阵x
添加另一行。相反,它只是将y
添加到第一行的末尾,以创建更长的行。但是,如果我尝试x = numpy.append(x, y, 1)
,以便我追加到第1轴,那么我会收到错误:TypeError: Required argument 'object' (pos 1) not found
。
当我连续追加这样的行时,似乎我一直在制作原始数组的副本,随着数组的增长,这将是低效的。当我不知道最终数组的大小是什么时,还有其他方法吗?
谢谢!
答案 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)
还可以查看vstack
,hstack
。dstack
等
但更好的是,使用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
删除第一行(因为它仅包含零)。尽管我的解决方案不能解决您的整个问题,但对于一些正面临您问题的第一部分的人可能会有所帮助。