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

finding array rows that satisfy conditions on two column values

我有一个包含许多行和 3 列的 numpy 整数数组。显示了一个示例。第 2 和第 3 列代表索引,每个第 2 列值 < 对应的第 3 列值。

我还有一个变量k。对于这个例子,我将使用 k = 4.

任务:我想找到所有的数组行,其中 k 严格不在第 2 列和第 3 列的值之间。因此,在每个 'surviving' 行中,第 2 列和第 3 列的值都将小于 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]])但没有成功。另外,我对'|'是否有点粗略是执行逻辑 'or'.

的正确方法

谢谢

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

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

背后的逻辑是检查两列是否低于(或大于)k,然后乘以对应于 and 的结果,然后将结果向量相加并检查是否它们大于 1,应该对应于 or

您可以使用 numpy.compress "Return selected slices of an array along given axis" 来替换 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)

注意:条件是一样的,只是放入一个变量,用行隔开。