从操作中排除确切的一个NumPy数组条目的最佳方法是什么?
我有一个包含x
值的数组n
,并希望在我调用i
时排除numpy.prod(x)
条目。我知道MaskedArray
,但还有其他/更好的方法吗?
答案 0 :(得分:7)
我认为最简单的是
np.prod(x[:i]) * np.prod(x[i+1:])
这应该很快,并且当您不想或不能修改x时也可以使用。
如果x是多维的,我是一个元组:
x_f = x.ravel()
i_f = np.ravel_multi_index(i, x.shape)
np.prod(x_f[:i_f]) * np.prod(x_f[i_f+1:])
答案 1 :(得分:3)
您可以使用np.delete
从一维array
删除元素:
import numpy as np
x = np.arange(1, 5)
i = 2
y = np.prod(np.delete(x, i)) # gives 8
答案 2 :(得分:1)
老实说,我认为没有更好的方法。即使不知道NumPy函数,我也会这样做:
#I assume x is array of len n
temp = x[i] #where i is the index of the value you don't want to change
x = x * 5
#...do whatever with the array...
x[i] = temp
如果我理解正确,你的问题是一维的吗?即使没有,你也可以这样做。
编辑:
我检查了prod
函数,在这种情况下,我认为你可以将你不想使用的值替换为1(使用上面给出的temp
方法),然后再放入正确的价值。这只是一个就地改变,所以它有点高效。第二种方法是将结果除以x[i]
值(假设它不是0,正如评论者所说)。
答案 3 :(得分:1)
由于np.prod
正在使用array
中所有元素的产品,如果我们要从解决方案中排除一个元素,我们可以将该元素设置为{ {1}}首先为了忽略它(1
)。
所以:
p * 1 = p
我们可以看到,它起作用:
>>> n = 10
>>> x = np.arange(10)
>>> i = 0
>>> x[i] = 1
>>> np.prod(x)
362880
答案 4 :(得分:0)
您可以使用列表推导来索引所有点,但是1:
i = 2
np.prod(x[[val for val in range(len(x)) if val != i]])
或使用设定差异:
np.prod(x[list(set(range(len(x)) - {i})])