如何在numpy数组的每行中使用不同的索引?

7

我有一个NxM的numpy数组,里面填充了零和一个大小为N的1D numpy数组,其中包含0到M-1之间的随机整数。正如您所看到的,数组的维度与矩阵中的行数匹配。整数数组中的每个元素表示在其对应行中的给定位置必须设置为1。例如:

# The matrix to be modified
a = np.zeros((2,10))
# Indices array of size N
indices = np.array([1,4])
# Indexing, the result must be
a = a[at indices per row]
print a

[[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]]

我尝试使用索引 a[:,indices],但这会为每一行设置相同的索引,最终将所有行都设置为1。我该如何为每一行单独设置给定的索引为1?
2个回答

13

使用np.arange(N)来定位行和列的索引:

>>> a[np.arange(2),indices] = 1
>>> a
array([[ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.]])

或:

>>> a[np.where(indices)+(indices,)] = 1
>>> a
array([[ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.]])

1
太好了。这意味着我必须学习通过简单切片(如0:2或只是:表示所有行)访问行与将索引作为对来访问行和列以设置值之间的区别。 - Alejandro Sazo
@AlejandroSazo 是的,确实,你也可以将列和行索引作为元组传递给数组。例如,a[np.where(indices)+(indices,)] = 1也将达到同样的效果。 - Mazdak
有人能解释一下为什么使用 np.arange(nrows) 可以工作,但使用冒号 : 就不行吗?@Kasramvd 我认为冒号相当于“使用所有行”,而 np.arange(nrows) 默认为 np.array([0,1,2,...,nrows-1]),这与使用所有行是一样的。是因为你需要明确地声明每个行索引,因为如果你提供了它,numpy 会压缩行、列,但如果你使用冒号,它就不会执行任何压缩?这是我的猜想。 - Corey Levinson
当索引为0时,第二个选项会发生什么?我认为这将引发一个错误。 - myradio

2

您还应该检查np.eye()函数,它正好可以做到您想要的。它基本上创建由零和对角线为1的2D数组。

>>> np.eye(a.shape[1])[indices]
array([[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接