【问题标题】:Sum function using slices with a numpy array Python使用带有 numpy 数组 Python 的切片的 Sum 函数
【发布时间】:2021-04-23 22:18:42
【问题描述】:

有没有一种方法可以像在普通列表函数中那样索引 numpy 列表。我想遍历列表中的 3 个元素,每次向上移动一个点并对所有切片求和。所以它会通过1,2,3 进行第一个总和,然后它将通过2,3,4 进行第二个总和等等。下面的代码给了我一个标量错误,有没有一种方法可以在不使用的情况下执行下面的函数for 循环。

import numpy as np
n = 3 
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8,9, 10, 11,12, 13, 14, 15, 16, 17, 18, 19, 20, 21 ,22, 23, 24, 25])
start = np.arange(0, len(arr)-n, 1)
stop = np.arange(n-1, len(arr), 1)
sum_arr = np.sum(arr[start:stop])

【问题讨论】:

  • [n:m] 需要标量值,而不是数组。当在数组和列表中使用时,这是正确的。为什么不使用列表推导式?
  • @hpaulj 我不想在 for 循环中使用列表理解,因为它很慢。如果可能的话,我只想使用数组。
  • 一开始最好使用一些缓慢但有效的东西,而不是尝试一些“我希望它有效”的猜测!但是moving-windows - as_stridedconvolvingcumsum 等有很多替代方案。

标签: python numpy sum slice numpy-ndarray


【解决方案1】:

我认为这应该可行:

sum_arr = arr[1:-1] + arr[2:] + arr[:-2]

这将创建一个比 arr 短两个值的数组,因为 arr 中的最后一个元素没有两个额外的元素来创建和。

如果您希望数组与原始 arr 具有相同的长度,您可以将两个额外的零附加到 arr 数组,如下所示:

arr = np.append(arr, [0, 0])
sum_arr = arr[1:-1] + arr[2:] + arr[:-2]

【讨论】:

  • 没有更好的版本,我可以声明数组的数量来用 like 对函数求和,而不是取 3 个数字,我会说 5 等等。
  • 我也更新了它,因为我也无法定义问题。
【解决方案2】:

要对n 元素的滑动范围求和,您可以使用convolve1d,并将所有权重设置为1。使用'constant' 边界模式,默认填充值为0。由于过滤器窗口默认居中,因此您需要调整两端的结果长度。

import numpy as np 
from scipy.ndimage import convolve1d

arr = np.arange(1,26)

for n in range(2,6):
   k,r = divmod(n, 2)
   print(n, convolve1d(arr, np.ones(n), mode='constant')[k+r-1:-k])

结果:

2 [ 3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49]
3 [ 6  9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72]
4 [ 10 14 18 22 26 30 34 38 42 46 50 54 58 62 66 70 74 78 82 86 90 94]
5 [ 15  20  25  30  35  40  45  50  55  60  65  70  75  80  85  90  95 100 105 110 115]

【讨论】:

  • 有没有一种方法可以在没有 for 循环的情况下迭代函数。正如我在上面的细节中解释的那样,我试图让函数尽可能快地运行。
  • 这就是为什么我提出了一个解决方案没有循环(示例中的循环只是为了演示不同的窗口大小,即对于任何给定的n,例如@ 987654330@ 不会有循环,只有一次调用convolve1d)
猜你喜欢
  • 2021-05-05
  • 2020-11-29
  • 2020-12-11
  • 2011-08-30
  • 2022-11-19
  • 2017-06-24
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
相关资源
最近更新 更多