我有一个数组,我希望使用NumPy选择我在Python中不同列上的某些条件的行。例如,考虑这个数组:
test_array = numpy.array(([1,2,3,5],[4,5,6,7],[7,8,9,4]))
现在我想要第1列为1
且第4列为5
的所有行。
所以输出应该是[1,2,3,5]
,在这种情况下只有1行。
答案 0 :(得分:1)
[list(x) for x in test_array if x[0]==1 and x[3]==5]
这为您提供了所需的输出:
[[1, 2, 3, 5]]
对于像这样的数组
test_array=numpy.array(([1,2,3,5],[4,5,6,7],[7,8,9,4],[1,98,76,5]))
然后你会获得
[[1, 2, 3, 5], [1, 98, 76, 5]]
假设您调用结果res
,您可以轻松访问结果。例如res[1]
将为[1, 98, 76, 5]
。
如果 - 无论出于何种原因 - 你想获得1和5之间的两个数字你可以使用
[sl[1:3] for sl in res]
会给你
[[2, 3], [98, 76]]
那是你在找什么?
答案 1 :(得分:0)
您可以使用以下方法:
>>> test_array[np.where(np.all(test_array[:,[0,3]]==[1,5],axis=1))]
array([[1, 2, 3, 5]])
答案 2 :(得分:0)
布尔索引/屏蔽可以很好地完成工作
In [498]: test_array=np.array(([1,2,3,5],[4,5,6,7],[7,8,9,4]))
In [499]: I = (test_array[:,0]==1) & (test_array[:,3]==5)
In [500]: I
Out[500]: array([ True, False, False], dtype=bool)
In [501]: test_array[I,:]
Out[501]: array([[1, 2, 3, 5]])
在计算I
时,请自由使用()
,以便==
测试优先于&
。 Kasra
测试也可以:I = np.all(test_array[:,[0,3]]==[1,5],axis=1)
。
答案 3 :(得分:0)
如果您希望将函数作为行的条件,则可以执行以下操作:
def filter(row):
if row[0]==1 and row[3]==5:
return True
return False
out_array = test_array[numpy.array([filter(row) for row in test_array])]
numpy.array([filter(row) for row in test_array])
为您提供一个布尔数组,对应于您想要的行,以及您不需要的行。