【问题标题】:Find location of pair of elements in two arrays in numpy在numpy中查找两个数组中元素对的位置
【发布时间】:2016-03-01 16:25:12
【问题描述】:

我有两个numpy 数组xy

假设x = [0, 1, 1, 1, 3, 4, 5, 5, 5]y = [0, 2, 3, 4, 2, 1, 3, 4, 5]

两个数组的长度相同,我要找的坐标对肯定存在于数组中。

如何在这些数组中找到(a, b) 的索引,其中ax 中的一个元素,by 中的对应元素。例如,(1, 4) 的索引为3xy 的索引3 处的元素分别为14

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    如果你想要一个纯粹的numpy 解决方案,你可以使用numpy.wherenumpy.logical_and

    In [16]: import numpy as np
    
    In [17]: x = np.array([0, 1, 1, 1, 3, 4, 5, 5, 5])
    
    In [18]: y = np.array([0, 2, 3, 4, 2, 1, 3, 4, 5])
    
    In [19]: np.where(np.logical_and(x == 1, y == 4))[0]
    Out[19]: array([3], dtype=int64)
    

    numpy.logical_and 允许您在两个 numpy 数组之间按元素执行逻辑与运算。我们在这里所做的是确定哪些位置在相同的相应位置中同时包含 x 值为 1 和 y 值为 4 的位置。满足这一点的位置是Truenumpy.where 确定数组中满足此条件的位置。 numpy.where 实际上返回条件为 True 的行和列位置作为两个元素的元组,但由于我们只考虑一个维度,因此只有第一个元组是有效的,这就是为什么我们立即索引第一个元组的元素。

    输出是一个numpy 位置数组,其中条件有效。您甚至可以更进一步,将输出强制为索引列表,以使事情更整洁和/或如果需要(感谢@EddoHintoso):

    In [20]: list(np.where(np.logical_and(x == 1, y == 4))[0])
    Out[20]: [3]
    

    【讨论】:

    • 并且 OP 可以通过包装 list() 将最后一个输出强制转换为列表。这是迄今为止最正确的答案。
    【解决方案2】:

    您可以将第一个数组与第一个值进行比较,将第二个数组与第二个值进行比较,然后找到True 的位置。然后你可以得到Trueargmax,这将为你提供第一个True 出现的第一个索引:

    x = np.array([0, 1, 1, 1, 3, 4, 5, 5, 5])
    y = np.array([0, 2, 3, 4, 2, 1, 3, 4, 5])
    idx = ((x == 1) & (y == 4)).argmax()
    
    In [35]: idx
    Out[35]: 3
    
    In [36]: x == 1
    Out[36]: array([False,  True,  True,  True, False, False, False, False, False], dtype=bool)
    
    In [37]: y == 4
    Out[37]: array([False, False, False,  True, False, False, False,  True, False], dtype=bool)
    

    如果您可以多次出现,您可以使用nonzero 进行以下操作:

    idx_list = ((x == 1) & (y == 4))
    idx = idx_list.nonzero()[0]
    
    In [51]: idx
    Out[51]: array([3], dtype=int64)
    

    或者如果您需要list 的索引:

    In [57]: idx_list.nonzero()[0].tolist()
    Out[57]: [3]
    

    你可以在一行中做到这一点:

    idx = ((x == 1) & (y == 4)).nonzero()[0]
    

    【讨论】:

    • 如果 (1,4) 有多个匹配项怎么办?
    • @rayryeng 然后你可以使用nonzero,为此编辑
    • 不错。从我投票。谢谢。
    【解决方案3】:
    x = [0, 1, 1, 1, 3, 4, 5, 5, 5]
    y = [0, 2, 3, 4, 2, 1, 3, 4, 5]
    w=zip(x,y)
    w.index((1,4))
    

    【讨论】:

    • 请使用numpy解决方案
    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2019-09-28
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多