我必须将两个不同大小的numpy
数组相乘(a
和b
),但我需要在调整大小之前丢弃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
答案 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
相对时间可能因b
和a
的大小而异。虽然resize可以在适当的位置完成,但它可能需要一个新的数据缓冲区,特别是如果它填充了大量的零。