【问题标题】:Select rows such that specific column contains values from a list选择行以使特定列包含列表中的值
【发布时间】:2016-12-08 13:42:57
【问题描述】:

我想从 numpy 数组中获取在一列中具有特定值的行。下面的示例显示了我的方法。当我给出特定值时,我能够得到行,但是当我给出多个值作为 ('4', '8') 时,我没有收到预期的行。

import numpy as np

arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
arr2 = arr[arr[:,3] == 4]
arr3 = arr[arr[:,3] in ('4', '8')]

arr 是array([[ 1, 2, 3, 4],[ 5, 6, 7, 8], [ 9, 10, 11, 12]])

arr2 是array([[1, 2, 3, 4]])

arr3 是array([1, 2, 3, 4])

我应该使用什么命令来获取输出 array([[1, 2, 3, 4], [ 5, 6, 7, 8]])?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    使用np.in1d 为我们正在搜索的任何元素创建一个掩码,然后简单地使用boolean indexing 从输入数组中选择有效行 -

    arr[np.in1d(arr[:,3], [4,8])]
    

    示例运行 -

    In [149]: arr
    Out[149]: 
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]])
    
    In [150]: np.in1d(arr[:,3], [4,8]) # Mask of valid ones
    Out[150]: array([ True,  True, False], dtype=bool)
    
    In [151]: arr[np.in1d(arr[:,3], [4,8])] # Select rows off arr
    Out[151]: 
    array([[1, 2, 3, 4],
           [5, 6, 7, 8]])
    

    【讨论】:

    • 非常感谢 :) 我会在启用后立即接受这个答案(~10 分钟)
    【解决方案2】:

    虽然没有理由偏离numpy-verse,但我想我会提供另一种使用列表理解的方法:

    idxs = [True if any(value in (4, 8) for value in row) else False for row in arr]
    
    # convert it to a numpy array
    idxs = np.array(idxs)
    
    new_arr = arr[idxs]
    

    查看结果:

    print(new_arr)
    [[1 2 3 4]
     [5 6 7 8]]
    

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 2012-03-10
      • 1970-01-01
      • 2014-08-04
      • 1970-01-01
      • 2021-03-18
      • 2021-12-01
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多