【问题标题】:NumPy slicing: All except one array entryNumPy 切片:除一个数组条目外的所有内容
【发布时间】:2018-01-02 13:01:33
【问题描述】:

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

【问题讨论】:

  • 假设它不是必须在特定轴上完成的操作并且保证第 i 个条目不为 0,您可以执行 np.prod(x) / x[i]
  • @Reti43 除非numpy 优化,否则非常效率低下
  • 应该排除的i-th 元素为零,所以np.prod(x) / x[i] 不起作用...
  • @Divakar 我的答案完全正确!
  • @joe-92 是的,将值暂时存储在某个地方,然后再将其设置回来。我认为那将是最有效的。

标签: python python-3.x numpy


【解决方案1】:

我认为最简单的应该是

np.prod(x[:i]) * np.prod(x[i+1:])

这应该很快,并且在您不想或无法修改 x 时也可以使用。

如果 x 是多维的并且 i 是一个元组:

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:])

【讨论】:

  • 有趣且非常 Pythonic 的方法,+1。
  • @Sqoshu 哦,谢谢。很多时候,我因为不懂python而被钉死在十字架上,所以这是一个很好的改变。
  • 还要注意空数组的乘积是1,所以即使要排除的第i个元素是第一个或最后一个,这仍然有效。
【解决方案2】:

您可以使用np.delete 从一维array 中删除一个元素:

import numpy as np
x = np.arange(1, 5)  
i = 2
y = np.prod(np.delete(x, i)) # gives 8

【讨论】:

  • 这应该比较慢,因为np.delete 如果我没记错的话,会用新数据创建一个新数组。
【解决方案3】:

老实说,我认为没有更好的方法。即使不知道 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,正如评论者所说)。

【讨论】:

    【解决方案4】:

    由于np.prodarray 中所有元素的乘积,如果我们想从解决方案中排除一个元素,我们可以先将该元素设置为1为了忽略它(如p * 1 = p)。

    所以:

    >>> n = 10
    >>> x = np.arange(10)
    >>> i = 0
    >>> x[i] = 1
    >>> np.prod(x)
    362880
    

    我们可以看到,这是有效的:

    >>> 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9
    362880
    

    【讨论】:

    • 如果你将它设置为 NaN,你可以使用numpy.nanprod,但我猜几乎没有关系
    【解决方案5】:

    您可以使用列表推导来索引除 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})])
    

    【讨论】:

      猜你喜欢
      • 2022-07-26
      • 1970-01-01
      • 2019-08-07
      • 2017-06-03
      • 2022-11-19
      • 2014-05-15
      • 1970-01-01
      • 2015-01-08
      • 2012-09-17
      相关资源
      最近更新 更多