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

时间:2010-01-21 17:04:25

标签: python numpy

我正在尝试为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 个答案:

答案 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值)的列表,并从数组中恢复这些特定元素。