从数组中选择每行的特定列

6 投票
3 回答
11743 浏览
提问于 2025-04-15 18:19

我想从一个numpy数组的每一行中选择特定的列元素。比如,在下面这个例子中:

In [1]: a = np.random.random((3,2))
Out[1]: 
array([[ 0.75670668,  0.1283942 ],
       [ 0.51326555,  0.59378083],
       [ 0.03219789,  0.53612603]])

我想选择第一行的第一个元素,第二行的第二个元素,以及第三行的第一个元素。所以我尝试了以下方法:

In [2]: b = np.array([0,1,0])

In [3]: a[:,b]

但是这样得到的结果是:

Out[3]: 
array([[ 0.75670668,  0.1283942 ,  0.75670668],
       [ 0.51326555,  0.59378083,  0.51326555],
       [ 0.03219789,  0.53612603,  0.03219789]])

这显然不是我想要的。有没有简单的方法可以做到我想做的,而不需要使用循环呢?

3 个回答

2

这段话不是一个答案,更像是对这个问题的一些记录。对于上面的答案,我们可以这样理解:

>>> import numpy as np
>>> A = np.array(range(6))
>>> A
array([0, 1, 2, 3, 4, 5])
>>> A.shape = (3,2)
>>> A
array([[0, 1],
       [2, 3],
       [4, 5]])
>>> A[(0,1,2),(0,1,0)]
array([0, 3, 4])

指定一组行和列的坐标(可以是列表或元组)可以让我们对数组进行一种叫做花式索引的操作。评论中的第一个例子乍一看很像,但那些索引其实是切片。切片并没有覆盖整个范围,因此返回的数组的形状是不同的:

>>> A[0:2,0:2]
array([[0, 1],
       [2, 3]])

对于评论中的第二个例子:

>>> A[[0,1],[0,1]]
array([0, 3])

所以看起来切片是不同的,但除了这个,索引的构造方式无论如何,你都可以指定一个包含(x值,y值)的元组或列表,从数组中提取出那些特定的元素。

3

好的,为了更清楚地说明,我们来做一个简单的例子。

A=diag(arange(0,10,1))

这个例子会得到

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 2, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 3, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 4, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 5, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 6, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 7, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 8, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 9]])

然后

A[0][0:4]

会得到

array([0, 0, 0, 0])

这是第一行,元素从0到3。但是

A[0:4][1]

并不会得到每一行的前四个元素,而是我们得到的是

array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0])

也就是说,整个第二列。

A[0:4,1]

这个例子会得到

array([0, 1, 0, 0])

我相信这里面一定有很好的理由,这对程序员来说是完全合理的,但对于我们这些不太懂的人来说,这可能会让人感到困惑。

8

你可以在上面的例子中使用:

a[np.arange(3), (0,1,0)]

这个代码块。

撰写回答