我可以使用array.resize(shape)
调整数组大小,并将零添加到这些索引而没有任何值。如果我的数组是[1,2,3,4]
并且我使用array.resize[5,0]
,我会得到[1,2,3,4,0]
。如何将零附加/填充到前面,产生[0,1,2,3,4]
?
我正在动态地这样做 - 尝试使用:
array.resize(arrayb.shape)
我想避免(不惜一切代价)制作数组的内存副本。那就是反转数组,调整大小和反转。使用视图将是理想的。
答案 0 :(得分:3)
您可以尝试使用负步幅处理数组(尽管您无法确定调整大小可能不必复制):
_a = np.empty(0) # original array
a = _a[::-1] # the array you work with...
# now instead of a, resize the original _a:
del a # You need to delete it first. Or resize will want refcheck=False, but that
# will be dangerous!
_a.resize(5)
# And update a to the new array:
a = _a[::-1]
但我真的建议你让数组足够大,如果以任何可能的方式,这似乎不是很漂亮,但我认为这是复制数据的唯一方法。你的数组也会有一个负面的步幅,所以它不会是连续的,所以如果这意味着你在它上面使用的某些功能必须复制,那你就不走运了。
此外,如果您对a
或_a
进行切片,则必须创建copy
,或确保在调整大小之前将其删除。虽然您可以提供refcheck=False
,但这似乎会使数据无效。
答案 1 :(得分:2)
我相信你可以使用切片分配来做到这一点。我认为没有理由numpy
需要为此类操作制作副本,只要它对重叠进行必要的检查(当然,正如其他人所指出的那样,resize
可能本身必须分配一个新的内存块)。我用一个非常大的数组测试了这个方法,我没有看到内存使用量的跳跃。
>>> a = numpy.arange(10)
>>> a.resize(15)
>>> a[5:] = a[:10]
>>> a[0:5] = 0
>>> a
array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
以下显示分配操作的内存使用没有跳转:
>>> a = numpy.arange(100000000)
>>> a.resize(150000000)
>>> a[50000000:] = a[:100000000]
我不知道更好的方法,这只是一个猜想。如果它不起作用,请告诉我。