切片的numpy数组不拥有其数据

时间:2017-09-09 17:16:30

标签: python arrays numpy

我必须将两个不同大小的numpy数组相乘(ab),但我需要在调整大小之前丢弃b的第一个元素。

我看到的是,如果我使用完整的b数组,则调整大小没有问题(但结果不是我需要的,因为它包含b的第一个元素)。如果我在应用resize之前尝试关闭第一个元素,我会得到一个

ValueError: cannot resize this array: it does not own its data

为什么会发生这种情况,如何以最有效的方式解决这个问题?

import numpy as np

# Some data
a = np.random.uniform(0., 1., 17)

# Works
b = np.array([56, 7, 343, 89, 234])
b.resize(a.shape)
d = b * a    

# Does not
b = np.array([56, 7, 343, 89, 234])[1:]
b.resize(a.shape)
d = b * a

2 个答案:

答案 0 :(得分:1)

另一个订单?将b填充到一个元素b.resize((len(a)+1,))

然后乘以d = b[1:] * a

b = np.array([56, 7, 343, 89, 234])
b.resize((len(a)+1,))
d = b[1:] * a

答案 1 :(得分:1)

另一种选择是对重要的术语进行乘法运算:

n = len(b)-1
d = np.zeros_like(a)
d[:n] = b[1:] * a[:n]

有:

In [628]: a.shape
Out[628]: (1000000,)
In [629]: b=np.arange(100)

这比(大约相同的时间)快2倍

b.resize(len(a)+1,); d = b[1:] * a
b1 = b[1:].copy(); b1.resize(len(a)); d = b1 * a

相对时间可能因ba的大小而异。虽然resize可以在适当的位置完成,但它可能需要一个新的数据缓冲区,特别是如果它填充了大量的零。