附加numpy数组的有效方法

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)

更糟糕的是它创造了一个未初始化的价值.

DrV*_*DrV 7

关于"为什么列表"部分的一些技术解释.

在内部,未知长度列表的问题在于,无论其长度如何,它都需要以某种方式适合内存.基本上有两种不同的可能性:

  1. 使用数据结构(链表,某些树结构等),这样就可以为列表中的每个新元素分别分配内存.

  2. 将数据存储在连续的内存区域中.创建列表时必须分配此区域,并且必须大于我们最初需要的区域.如果我们在列表中获得更多内容,我们需要尝试分配更多内存,最好是在同一位置.如果我们不能在同一个位置进行,我们需要分配一个更大的块并移动所有数据.

第一种方法可以实现各种花哨的插入和删除选项,排序等.但是,顺序读取速度较慢,并且分配更多内存.Python实际上使用方法#2,列表存储为"动态数组".有关这方面的更多信息,请参阅:

内存中列表的大小

这意味着列表的设计非常有效append.如果您事先不知道列表的大小,那么您可以做很少的事情来加快速度.


如果您事先知道列表的最大大小,那么最好分配一个numpy.array使用numpy.empty(不是numpy.zeros)最大大小的内容,然后ndarray.resize在填写所有数据后使用缩小数组.

出于某种原因numpy.array(l),l列表对于大型列表来说通常很慢,而复制甚至大型数组的速度非常快(我只是尝试创建一个100 000 000元素数组的副本;它花了不到0.5秒).

这个讨论对不同的选择有更多的基准:

增长numpy数值数组的最快方法

我没有对numpy.empty+ ndarray.resizecombo进行基准测试,但两者都应该是微秒级而不是毫秒级的操作.


Bi *_*ico 5

如果您已在列表中包含所有内容,则有三种方法可以执行此操作:

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))但我不建议在循环中附加到该数组.

  • 所有的方法都使用list ...是不是有办法在np.arrays中完全做到这一点...... numpy家伙难道不能找到方法吗?和'n = np.empty((0,2))'不起作用 (2认同)