假设我有一个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)中很好地描述了我的问题的解决方案.谢谢.
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]])
Run Code Online (Sandbox Code Playgroud)
a==2
返回一个布尔numpy数组,显示条件为True的位置:
In [82]: a==2
Out[82]:
array([[False, True, False],
[False, False, False],
[False, False, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令找到任何列为True的列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)
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令找到两个条件同时为真的位置&
:
In [85]: np.any(a==2,axis=0) & np.any(a==5,axis=0)
Out[85]: array([False, True, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
最后,您可以使用以下命令找到条件同时为True的列的索引np.where
:
In [86]: np.where(np.any(a==2,axis=0) & np.any(a==5,axis=0))
Out[86]: (array([1]),)
Run Code Online (Sandbox Code Playgroud)
以下是受 Python Zen 启发的处理列或行条件的方法。
In []: import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
...
Run Code Online (Sandbox Code Playgroud)
因此,遵循第二个建议:
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]])
Run Code Online (Sandbox Code Playgroud)
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]])
Run Code Online (Sandbox Code Playgroud)
因此,我希望在访问列和行时始终明确这一点确实有意义。代码通常由具有不同背景的人阅读。