我正在尝试为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]])
这显然不是我想要的。有没有一种简单的方法可以在不使用循环的情况下做我想做的事情?
答案 0 :(得分:8)
您可以使用:
a[np.arange(3), (0,1,0)]
在上面的示例中。
答案 1 :(得分: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]
不给出前4行,每行有第2行。相反,我们得到
array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0])
即整个第二栏。
A[0:4,1]
给出
array([0, 1, 0, 0])
我确信这有一个非常好的理由,这对程序员来说非常有意义 但对于我们这些伟大宗教中没有经验的人来说,这可能会令人困惑。
答案 2 :(得分: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值)的列表,并从数组中恢复这些特定元素。