给定下面定义的数组:
a = np.arange(30).reshape((3, 10)
col_index = [[1,2,3,5], [3,4,5,7]]
row_index = [2,1]
是否可以索引a[row_index, col_index]
,所以我可以做类似的事情
a[row_index, col_index] =1
,然后a成为
[[0,1,2,3,4,5,6,7,8,9], [10,11,12,1,1,1,16,1,18,19], [20,1,1,1,24,1,26,27,28,29]]
因此,为了澄清,在第2行中,第1,2,3和5列设置为1,而在第1行中,第3,4,5,7列也设置为1.
答案 0 :(得分:2)
或(如果你不喜欢打字)
a[np.c_[row_index], col_index] = 1
甚至更短但仅限Python 2
a[zip(row_index), col_index] = 1
所有这些解决方案的作用是使行和列索引broadcastable互相生成。 np.c_
是列连接便利对象。它使1D对象中的列成为可能。
zip
曾经基本上做过相同的事情。只是,因为Python 3它返回一个迭代器而不是一个列表,numpy不能处理它们。 (可以做list(zip(row_index))
,但这不是短暂的。)
答案 1 :(得分:0)
row_index
列表的形状应与col_index
列表的形状相同。
a[np.array(row_index)[:, None], col_index] = 1
或者,
a[np.reshape(row_index, (-1, 1)), col_index] = 1
a
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 1, 1, 1, 16, 1, 18, 19],
[20, 1, 1, 1, 24, 1, 26, 27, 28, 29]])