我会保持简单。我有一个循环,将新行附加到numpy数组...这是有效的方法。
n=np.zeros([1,2])
for x in [[2,3],[4,5],[7,6]]
n=np.append(n,x,axis=1)
现在问题是[0,0]坚持它所以我必须通过
删除它 del n[0]
这似乎是愚蠢的...所以请告诉我一个有效的方法来做到这一点。
n=np.empty([1,2])
更糟糕的是它创造了一个未初始化的价值。
答案 0 :(得分:7)
对于"为什么列表"的一些技术解释。一部分。
在内部,未知长度列表的问题在于,无论长度如何,它都需要以某种方式适合内存。基本上有两种不同的可能性:
使用数据结构(链表,某些树结构等),这样就可以为列表中的每个新元素分别分配内存。
将数据存储在连续的内存区域中。创建列表时必须分配此区域,并且必须大于我们最初需要的区域。如果我们在列表中获得更多内容,我们需要尝试分配更多内存,最好是在同一位置。如果我们不能在同一个位置进行,我们需要分配一个更大的块并移动所有数据。
第一种方法可以实现各种花哨的插入和删除选项,排序等。但是,顺序读取速度较慢,并且分配更多内存。 Python实际上使用方法#2,列表存储为"动态数组"。有关这方面的更多信息,请参阅:
这意味着使用append
列表的效率非常高。如果您事先不知道列表的大小,那么您可以做很少的事情来加快速度。
如果您事先知道列表的最大大小,那么最好使用numpy.array
(不是numpy.empty
)分配numpy.zeros
最大大小,然后使用{{ 1}}填写所有数据后缩小数组。
出于某种原因,ndarray.resize
numpy.array(l)
列表中的列表通常很慢,而大型列表的复制速度很快(我只是试图创建一个100 000 000元素数组的副本) ;花了不到0.5秒)。
此讨论对不同选项有更多基准:
Fastest way to grow a numpy numeric array
我没有对l
+ numpy.empty
组合进行基准测试,但两者都应该是微秒级而非毫秒级操作。
答案 1 :(得分:5)
如果列表中已包含所有内容,则有三种方法可以执行此操作:
data = [[2, 3], [4, 5], [7, 6]]
n = np.array(data)
如果您知道最终数组有多大:
exp = np.array([2, 3])
n = np.empty((3, 2))
for i in range(3):
n[i, :] = i ** exp
如果您不知道最终数组有多大:
exp = np.array([2, 3])
n = []
i = np.random.random()
while i < .9:
n.append(i ** exp)
i = np.random.random()
n = np.array(n)
您可以从n = np.empty((0, 2))
开始,或者我不建议在循环中追加该数组。
答案 2 :(得分:0)
您可能想尝试:
import numpy as np
n = np.reshape([], (0, 2))
for x in [[2,3],[4,5],[7,6]]:
n = np.append(n, [x], axis=0)
您也可以使用np.append
代替n = np.vstack([n,x])
。我也同意@Bi Rico我也会使用一个列表,如果n
不需要在循环中访问。