Han*_*Sun 31 python arrays numpy scipy
目前,我有一些像这样的代码
import numpy as np
ret = np.array([])
for i in range(100000):
tmp = get_input(i)
ret = np.append(ret, np.zeros(len(tmp)))
ret = np.append(ret, np.ones(fixed_length))
Run Code Online (Sandbox Code Playgroud)
我认为这个代码效率不高,因为np.append需要返回数组副本而不是修改ret就地
我想知道我是否可以使用extend像这样的numpy数组:
import numpy as np
from somewhere import np_extend
ret = np.array([])
for i in range(100000):
tmp = get_input(i)
np_extend(ret, np.zeros(len(tmp)))
np_extend(ret, np.ones(fixed_length))
Run Code Online (Sandbox Code Playgroud)
这样extend会更有效率.有没有人有这个想法?谢谢!
unu*_*tbu 35
想象一个numpy数组占用一个连续的内存块.现在想象一下其他对象,比如其他numpy数组,它们占用了我们numpy数组左右两侧的内存.没有空间可以附加或扩展我们的numpy数组.numpy数组中的基础数据总是占用连续的内存块.
因此,任何追加或扩展我们的numpy数组的请求只能通过分配一个全新的更大的内存块,将旧数据复制到新块然后追加或扩展来满足.
所以:
pv.*_*pv. 14
您可以使用.resize()ndarrays 的方法.它要求内存不被其他数组/变量引用.
import numpy as np
ret = np.array([])
for i in range(100):
tmp = np.random.rand(np.random.randint(1, 100))
ret.resize(len(ret) + len(tmp)) # <- ret is not referred to by anything else,
# so this works
ret[-len(tmp):] = tmp
Run Code Online (Sandbox Code Playgroud)
通过使用通常的阵列存储器叠加方案可以提高效率.
Bi *_*ico 10
处理此问题的常用方法是这样的:
import numpy as np
ret = []
for i in range(100000):
tmp = get_input(i)
ret.append(np.zeros(len(tmp)))
ret.append(np.zeros(fixed_length))
ret = np.concatenate(ret)
Run Code Online (Sandbox Code Playgroud)
由于其他答案已经进入的原因,通常不能在不复制数据的情况下扩展数组.