获知多个列值时2D numPy数组的行索引

时间:2011-02-06 00:54:48

标签: python numpy

假设我有一个2D numPy数组,例如:

  

a = [[1,2,3],[4,5,6],[7,8,9]]

如何查找我知道多个值的行的索引?例如,如果已知第0列为2且第1列为5,我想知道满足此条件的行索引(在本例中为第1行)。

在我的应用程序中,前两列是(x,y)坐标,第三列是有关该坐标的信息。我试图在列表中找到特定的坐标,以便我可以更改第三列中的值。

编辑:澄清一下,这是一个非正方形的例子:

  

a = [[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18]]

假设我知道我要查找的行在第0列中有13,在第1列中有14。我想返回该行的索引。在这种情况下,我想返回索引2(第2行)。

或者更好的是,我想编辑第0列中第13列和第1列中14列的第4列。这是我在我所描述的情况下找到的解决方案(将值更改为999):

  

a [(a [:,0 ] == 13)& (A [的:,1 ] == 14),   3] = 999

给出:

  

a = [[1,2,3,4,5,6],[7,8,9,   10,11,12],[13,14,15,999,17,18]]

如果不清楚,我很抱歉。有人可以在我的原始帖子(编辑上方)中指出如何对其进行不同的解释,因为我无法看到它。

感谢。

编辑2:修正了第一次编辑中的错误(以粗体显示)

我现在可以看到我如何让每个人都感到困惑。在我的解决方案的条件b)中很好地描述了我的问题的解决方案。谢谢。

3 个答案:

答案 0 :(得分:9)

In [80]: a = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ])
In [81]: a
Out[81]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

a==2返回一个布尔numpy数组,显示条件为True的位置:

In [82]: a==2
Out[82]: 
array([[False,  True, False],
       [False, False, False],
       [False, False, False]], dtype=bool)

您可以使用np.any(...,axis=0)找到任何列为True的列:

In [83]: np.any(a==2,axis=0)
Out[83]: array([False,  True, False], dtype=bool)

In [84]: np.any(a==5,axis=0)
Out[84]: array([False,  True, False], dtype=bool)

您可以使用&

找到两个条件同时为真的位置
In [85]: np.any(a==2,axis=0) & np.any(a==5,axis=0)
Out[85]: array([False,  True, False], dtype=bool)

最后,您可以使用np.where找到条件同时为True的列的索引:

In [86]: np.where(np.any(a==2,axis=0) & np.any(a==5,axis=0))
Out[86]: (array([1]),)

答案 1 :(得分:4)

以下是处理列或行的条件的方法,受到Python的Zen的启发。

In []: import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...

所以遵循第二条建议:
a)列上的条件,适用于行:

In []: a= arange(12).reshape(3, 4)
In []: a
Out[]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In []: a[2, logical_and(1== a[0, :], 5== a[1, :])]+= 12
In []: a
Out[]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8, 21, 10, 11]])

b)行上的条件,应用于列:

In []: a= a.T
In []: a
Out[]:
array([[ 0,  4,  8],
       [ 1,  5, 21],
       [ 2,  6, 10],
       [ 3,  7, 11]])
In []: a[logical_and(1== a[:, 0], 5== a[:, 1]), 2]+= 12
In []: a
Out[]:
array([[ 0,  4,  8],
       [ 1,  5, 33],
       [ 2,  6, 10],
       [ 3,  7, 11]])

所以我希望在访问列和行时,总是有意义的。代码通常由具有不同背景的人阅读。

答案 2 :(得分:2)

np.where(np.any(a==2,axis=0) & np.any(a==5,axis=0))

因为unutbu建议不会使用2在第0列的信息,5是在第1列。因此,对于a = np.array([[5, 2, 3], [2, 5, 6], [7, 8, 9]]),它会错误地返回(array([0, 1]),)

相反,您可以使用

np.where((a[0]==2) & (a[1]==5))

获取正确的结果(array([1]),)

此外,如果您要编辑该特定行的第二列,则可以跳过np.where,只需引用它:a[2][(a[0]==2) & (a[1]==5)]。这也适用于作业,例如a[2][(a[0]==2) & (a[1]==5)] = 11