【问题标题】:numpy sum of each array in a list of arrays of different size不同大小的数组列表中每个数组的numpy总和
【发布时间】:2021-07-08 09:50:49
【问题描述】:

给定一个 numpy 数组列表,每个数组的长度都不同,就像通过 lst = np.array_split(arr, indices) 获得的那样,我如何获得列表中每个数组的总和? (我知道如何使用列表理解来做到这一点,但我希望有一种纯 numpy 的方式来做到这一点)。

我认为这会起作用:

np.apply_along_axis(lambda arr: arr.sum(), axis=0, arr=lst)

但它没有,而是给了我这个我不明白的错误:

ValueError: 操作数不能与形状 (0,) (12,) 一起广播

注意:这是一个 sympy 对象数组。

【问题讨论】:

  • 请看看这是否有效:[sum(x) for x in lst]

标签: python numpy


【解决方案1】:

有一种更快的方法可以避免使用np.split,而是使用np.reduceat。我们创建了一个升序索引数组,您希望将元素与np.append([0], np.cumsum(indices)[:-1]) 相加。为了正确的索引,我们需要在前面放一个零(并丢弃最后一个元素,如果它覆盖了原始数组的整个范围......否则只需删除[:-1] 索引)。然后我们使用np.add ufunc 和np.reduceat

import numpy as np
arr = np.arange(1, 11)
indices = np.array([2, 4, 4])

# this should split like this
# [1  2 | 3  4  5  6 | 7  8  9  10]

np.add.reduceat(arr, np.append([0], np.cumsum(indices)[:-1]))
# array([ 3, 18, 34])

【讨论】:

  • 太棒了!这是一个我不知道的非常方便的功能。不过要注意一点:array_split 的索引不是块长度,而是拆分索引,因此您不需要 np.cumsum(arr)[:-1] 部分。巧合的是,我的索引来自在另一个数组上执行 _, indices = np.unique(arr, return_index=True),所以前面的 0 已经存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多