查找满足两列值条件的数组行
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)
注意:条件是一样的,只是放入一个变量,用行隔开。
我有一个包含许多行和 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)
注意:条件是一样的,只是放入一个变量,用行隔开。