查找满足两个列值条件的数组行

时间:2019-08-08 23:54:03

标签: python-3.x numpy-ndarray

我有一个具有许多行和3列的numpy整数数组。显示了一个示例。第二和第三列表示索引,每个第二列的值是<对应的第三列的值。

我也有一个变量k。在此示例中,我将使用 k = 4

任务:我想查找所有数组行,其中k严格不在第二列和第三列中的值之间。因此,在每个“幸存”行中,第二列和第三列的值都将为 k。

import numpy as np

arr = np.array([[-1, 0, 6],
                [-6, 1, 2],
                [-8, 3, 10],
                [ 3, 4, 11],
                [-2, 5, 9],
                [-4, 7, 8]])  

m = arr[((arr[:,1] > k) & (arr[:,2] > k)) | ((arr[:,1] < k) & (arr[:,2] < k))]

m(以上)的代码工作正常,可以正确生成以下数组:

[[-6, 1, 2],
 [-2, 5, 9],
 [-4, 7, 8]]

这是我的问题-是否可以简化或更好地表达m?   我尝试切片(即:在m的表达式中使用arr [:,1:]或arr [:,[1,2]])没有成功。另外,我对于“ |”是否有点粗略是执行逻辑“或”的正确方法。

谢谢

2 个答案:

答案 0 :(得分:0)

您可以使用向量代数运算。我不确定它是否会简化,但是它很时髦。

arr[np.prod(arr[...,1:3] < k, axis=1) + np.prod(arr[...,1:3] > k, axis=1) > 0,:]

后面的逻辑是检查两列是否均小于(或大于)k,并将与and相对应的结果相乘,然后将结果向量相加并检查它们是否为大于1,应与or相对应。

答案 1 :(得分:0)

您可以使用numpy.compress“沿给定轴返回数组的选定切片”来替换m = arr[]

import numpy as np

k = 4
arr = np.array([[-1, 0, 6],
                [-6, 1, 2],
                [-8, 3, 10],
                [3, 4, 11],
                [-2, 5, 9],
                [-4, 7, 8]])

cond_val = (((arr[:, 1] > k)
            & (arr[:, 2] > k))
            | ((arr[:, 1] < k)
            & (arr[:, 2] < k)))

m = np.compress(cond_val, arr, axis=0)

注意:条件是相同的,只是放入变量中并用行分隔。