3

我可以用它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)

我想避免(不惜一切代价)制作数组的内存副本。也就是对数组进行反转,调整大小,再反转一次。使用视图将是理想的。

4

2 回答 2

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这似乎使数据无效。

于 2012-09-04T20:50:45.833 回答
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]

我不知道更好的方法,这只是一个猜想。让我知道它是否不起作用。

于 2012-09-04T19:05:05.877 回答