【问题标题】:Getting the row index for a 2D numPy array when multiple column values are known当多个列值已知时获取 2D numPy 数组的行索引
【发布时间】:2011-02-06 00:54:48
【问题描述】:

假设我有一个 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:修复了第一次编辑中的错误(以粗体显示)

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

【问题讨论】:

  • 我很困惑。编辑后,您的结果是什么:sum(a[0]== 13)?谢谢
  • 不幸的是,我第一次编辑我的帖子时搞砸了,我现在已经修改了。感谢您的耐心等待。
  • 很高兴您能够解决您的问题。如果您觉得我的回答对您很有价值,您可以考虑支持它;-)。谢谢
  • @eat:在获得 15 名声望之前我无法投票,但我确实将其标记为我接受的答案。谢谢。
  • @lookitsmark:但你似乎已经接近 15 岁了 ;-)。谢谢

标签: python numpy


【解决方案1】:
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) 找到任何为真的列:

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】:

    以下是处理列或行条件的方法,灵感来自 Python 之禅。

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

    所以我希望在访问列和行时始终保持显式是有意义的。代码通常由具有不同背景的人阅读。

    【讨论】:

      【解决方案3】:

      在做

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

      unutbu 建议不会使用第 0 列中 2 和第 1 列中 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

      【讨论】:

      • 您的作业示例并没有完全给出我希望的结果。对于 a = np.array([[5, 2, 3], [2, 5, 6], [7, 8, 9]]) 使用 a[2][(a[0]==2) & ( a[1]==5)] = 11 当我希望它返回 array([ [ 5、2、3]、[2、5、11]、[7、8、9]])。但是,我已经找到了产生这个结果的解决方案: a[(a[0]==2) & (a[1]==5), 2] = 11
      • @lookitsmarc:根据您对 J0ker5 的评论,我想请您澄清您的问题。您愿意举一个满足您要求的非方形a 的示例吗?恕我直言,您当前的问题以某种方式将行和列相互混合。谢谢
      • 我已经编辑了我的原始帖子,并进行了更多澄清。我希望这就足够了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2022-01-19
      • 2021-08-21
      相关资源
      最近更新 更多