【问题标题】:How to specify columns when using repeated indices with numpy [for use with np.add.at()]使用带有 numpy 的重复索引时如何指定列 [用于 np.add.at()]
【发布时间】:2024-05-01 14:35:02
【问题描述】:

我正在尝试将加法运算符应用于我想要重复索引以指示重复加法运算的数组。从 Python 数据科学书籍 (https://jakevdp.github.io/PythonDataScienceHandbook/02.07-fancy-indexing.html) 看来,使用 np.add.at(original matrix, indices, thing to add) 似乎可以做到这一点,但我不知道如何指定索引以对列而不是行进行操作。

例如虚拟示例

# Create Array
A = np.arange(12)
A = A.reshape(4,3)
print(A)

给予

[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]

# Create columns to add to A (in reality, all values won't be the same)
B = np.ones_like(A[:, [0,0]])
print(adder)

给了

[[1 1]
 [1 1]
 [1 1]
 [1 1]]

我想执行操作A[:, [0, 0]] += B,但使用重复索引表示重复操作的系统(因此在这种情况下,B 的两列都添加到第 0 列)。结果应该是:

[[ 2  1  2]
 [ 5  4  5]
 [ 7  7  8]
 [ 11 10 11]]

我相信这可以使用np.add.at(A, I, B) 来完成,但是我如何指定索引I 对应于[:, [0,0]],因为这会产生语法错误(似乎索引矩阵不能包含@987654332 @ 字符?)。

谢谢

【问题讨论】:

  • 文档说I 可以是一个包含切片对象的元组。我的猜测是(slice(None),[0,0]) 应该可以工作。目前无法测试。
  • 谢谢,确实有效。如果你把它作为一个答案(最好有一些解释。请不要切片如何工作?),那么我可以接受。干杯

标签: python arrays numpy indexing array-broadcasting


【解决方案1】:
In [12]: A = np.arange(12).reshape(4,3)
In [13]: np.add.at(A, (slice(None), [0,0]), 1)
In [14]: A
Out[14]: 
array([[ 2,  1,  2],
       [ 5,  4,  5],
       [ 8,  7,  8],
       [11, 10, 11]])

这也可以写成s_ as

np.add.at(A, np.s_[:, [0,0]], 1)

s_ 是一个类对象,它允许我们使用索引符号来创建必要的元组。在索引上下文中,Python 解释器将 : 转换为 slice 对象。

In [19]: np.s_[:, [0,0]]
Out[19]: (slice(None, None, None), [0, 0])

【讨论】: