从数组中选择每行的特定列
我想从一个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)]
这个代码块。