NumPy切片:除一个数组条目外的所有切片

时间:2018-01-02 13:01:34

标签: python python-3.x numpy

从操作中排除确切的一个NumPy数组条目的最佳方法是什么? 我有一个包含x值的数组n,并希望在我调用i时排除numpy.prod(x)条目。我知道MaskedArray,但还有其他/更好的方法吗?

5 个答案:

答案 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})])