与numpy一起使用重复索引时如何指定列[用于np.add.at()]

时间:2018-11-12 05:26:14

标签: python arrays numpy indexing numpy-broadcasting

我试图将加法运算符应用于要重复索引以指示重复加法运算的数组。从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]],因为这样会产生语法错误(似乎索引矩阵可以不包含:字符?)。

谢谢

1 个答案:

答案 0 :(得分: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_写为

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])