【问题标题】:How to specify the last index explicitly to np.ufunc.reduceat如何将最后一个索引明确指定给 np.ufunc.reduceat
【发布时间】:2018-09-13 18:08:25
【问题描述】:

假设我有一个数组

data = np.arange(6)

我想用np.add.reduceat求整个数组和后半部分的总和。1

如果我这样做:

np.add.reduceat(data, [0, 6, 3])[::2]

我立即得到一个错误

IndexError: index 6 out-of-bounds in add.reduceat [0, 6)

如果我这样做

np.add.reduceat(data, [0, 5, 3])[::2]

我得到了错误的答案(10 应该是 15):

array([10, 12])

我能想到的唯一解决方案是屏蔽需要最后一个索引的位置,从中减去 1,然后将最后一个元素添加回那里:

index = np.array([0, 6, 3])
mask = (index == data.size)
index[mask] -= 1
result = np.add.reduceat(data, index)
# Mask is shifted back by one because it's the previous element that needs to be updated
result[:-1][mask[1:]] += data[-1]

然后result[::2] 给出想要的答案。这看起来像是一个巨大的杂物,我希望它是一个优雅的单线(并且比这更快)。


1完全知道有更好的方法来做到这一点。这只是为了说明的目的而设计的示例。这个问题的真正问题源于尝试解决numpy: fast regularly-spaced average for large numbers of line segments / points

【问题讨论】:

  • np.add.reduceat(np.add.reduceat(data, [0, len(data)-1, len(data)//2]),[0,2]) 怎么样?
  • @Divakar。没关系,我误读了括号。

标签: python numpy numpy-ufunc


【解决方案1】:

reduceat 我用的不多,但看起来你只能有一个开放式范围,一个add to the end

一种解决方法是填充数组(是的,我通常反对使用np.append :)):

In [165]: np.add.reduceat(np.append(x,0),[0,6,3])
Out[165]: array([15,  0, 12])

或具有完整的范围配对:

In [166]: np.add.reduceat(np.append(x,0),[0,6,3,6])
Out[166]: array([15,  0, 12,  0])

我省略了通常的 [::2] 以澄清发生了什么。

【讨论】:

  • 我知道在接受之前等待是传统的做法,但这正是我想要的。特别是因为在这种情况下明确定义了负增量。
  • 如果你想知道我最终将它用于什么:stackoverflow.com/a/52320926/2988730
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多