如何将最后一个索引显式指定给np.ufunc.redu文件

2024-09-27 07:22:54 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个数组

data = np.arange(6)

我想用^{}求整个数组和后半部分的和。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。你知道吗


Tags: of答案adddataindex错误npmask
1条回答
网友
1楼 · 发布于 2024-09-27 07:22:54

我没怎么用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]来澄清正在发生的事情。你知道吗

相关问题 更多 >

    热门问题