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