【问题标题】:NumPy sum along disjoint indicesNumPy 沿不相交索引求和
【发布时间】:2015-09-27 01:13:20
【问题描述】:

我有一个应用程序,我需要对 3D NumPy 数组中的任意索引组求和。内置的 NumPy 数组求和例程将所有索引沿 ndarray 的一个维度求和。相反,我需要对数组中某个维度的索引范围求和,然后返回一个新数组。

例如,假设我有一个形状为(70,25,3) 的ndarray。我希望总结某些索引范围内的第一个维度并返回一个新的 3D 数组。考虑来自0:25, 25:5050:75 的总和,它将返回一个形状为(3,25,3) 的数组。

是否有一种简单的方法可以沿 NumPy 数组的一维进行“不相交的求和”以产生此结果?

【问题讨论】:

  • 这些范围是否属于同一范围?

标签: python arrays numpy sum


【解决方案1】:

您可以使用np.add.reduceat 作为解决此问题的一般方法。即使范围的长度不同,这也有效。

要沿轴 0 对切片 0:2525:5050:75 求和,传入索引 [0, 25, 50]

np.add.reduceat(a, [0, 25, 50], axis=0)

此方法也可用于对非连续范围求和。例如,要对切片 0:2537:4751:75 求和,请编写:

np.add.reduceat(a, [0,25, 37,47, 51], axis=0)[::2]

相同长度范围求和的另一种方法是重塑数组,然后沿轴求和。与上面的第一个示例等效的是:

a.reshape(3, a.shape[0]//3, a.shape[1], a.shape[2]).sum(axis=1)

【讨论】:

  • 如果范围是连续的,则不需要重复索引,即[0, 25, 50] 在这种情况下会做同样的工作。
  • @Jaime:哦!感谢您的改进 - 我会更新答案。
  • 非常感谢您提供这个解决方案,它完全符合我的预期!
【解决方案2】:

只需将每个部分相加并使用结果创建一个新数组。

import numpy as np
i1, i2 = (2,7)

a = np.ones((10,5,3))
b = np.sum(a[0:i1,...], 0)
c = np.sum(a[i1:i2,...], 0)
d = np.sum(a[i2:,...], 0)

g = np.array([b,c,d])

>>> g.shape
(3, 5, 3)
>>> g
array([[[ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.]],

       [[ 5.,  5.,  5.],
        [ 5.,  5.,  5.],
        [ 5.,  5.,  5.],
        [ 5.,  5.,  5.],
        [ 5.,  5.,  5.]],

       [[ 3.,  3.,  3.],
        [ 3.,  3.,  3.],
        [ 3.,  3.,  3.],
        [ 3.,  3.,  3.],
        [ 3.,  3.,  3.]]])
>>>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2021-07-29
    • 2022-10-30
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多