2011-02-06 19 views
8

假设我有一个2D numpy的阵列,例如:获取的行索引,用于当多个列的值是已知的二维numpy的阵列

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

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

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

编辑:为了澄清,这里是一个非正方形例如:

一个= [[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 [:0] == 13)&(一个[:,1 ] == 14), 3] = 999

给出:

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

对不起,如果这不清楚。有人可能会在我的原始文章(编辑之上)中指出如何解释它,因为我无法看到它。

谢谢。

编辑2:在第一编辑修正错误(以粗体显示)

现在我可以看到我是如何做到这件事令人困惑的每一个人。我的问题的解决方案在食品解决方案的条件b)中有很好的描述。谢谢。

+0

我很蠢。编辑完成后,你的结果是:sum(a [0] == 13)?谢谢 – eat 2011-02-06 23:31:16

+0

不幸的是,第一次编辑我的帖子时我搞砸了,现在我已经修改了。感谢您的耐心。 – lookitsmarc 2011-02-07 02:11:53

回答

4

可以通过以下方法来处理的列或行的条件下,通过Python中的禅意。

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

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

因此,按照第二建议:
a)一列(多个)的条件下,施加到行(多个):在行(S)

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)中的条件下,施加到列(s):

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]]) 

所以我希望这真的有意义,当访问列和行时总是显式的。代码通常由具有各种背景的人阅读。

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返回boolean numpy的数组,表示在条件为真:

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

你可以找到任何列其中,这是真正的使用np.any(...,axis=0)

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列的索引:

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

否则

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

如unutbu建议将不使用图2是在第0列中的信息,并且图5是在第一。因此,对于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