我有一个具有许多行和3列的numpy整数数组。显示了一个示例。第二和第三列表示索引,每个第二列的值是<对应的第三列的值。
我也有一个变量k。在此示例中,我将使用 k = 4 。
任务:我想查找所有数组行,其中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]])没有成功。另外,我对于“ |”是否有点粗略是执行逻辑“或”的正确方法。
谢谢
答案 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)
注意:条件是相同的,只是放入变量中并用行分隔。