正如问题标题中所建议的,它可以通过数组索引来完成。
import numpy as np
a = np.ones((20,10))
idx = np.random.randint(low=0, high=a.shape[1], size=a.shape[0])
idx
# array([5, 0, 7, 3, 8, 7, 5, 1, 8, 8, 8, 8, 6, 9, 2, 4, 8, 4, 4, 7])
a[ np.arange( a.shape[0] ), idx ] += 1 # Array indexing
a
# array([[1., 1., 1., 1., 1., 2., 1., 1., 1., 1.],
# [2., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1., 1., 2., 1., 1.],
# [1., 1., 1., 2., 1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1., 1., 1., 2., 1.],
# [1., 1., 1., 1., 1., 1., 1., 2., 1., 1.],
# [1., 1., 1., 1., 1., 2., 1., 1., 1., 1.],
# [1., 2., 1., 1., 1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1., 1., 1., 2., 1.],
# [1., 1., 1., 1., 1., 1., 1., 1., 2., 1.],
# [1., 1., 1., 1., 1., 1., 1., 1., 2., 1.],
# [1., 1., 1., 1., 1., 1., 1., 1., 2., 1.],
# [1., 1., 1., 1., 1., 1., 2., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1., 1., 1., 1., 2.],
# [1., 1., 2., 1., 1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 2., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1., 1., 1., 2., 1.],
# [1., 1., 1., 1., 2., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 2., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1., 1., 2., 1., 1.]])
np.arange( a.shape[0] ) 对应每一行,idx 是列索引。