我有一个(巨大的)2D阵列。例如:
a=[[1,2],[2,3],[4,5]]
我需要从中提取满足特定条件的元素
a[:,0]>1 and a[:,1]>2
这样我得到一个只包含满足两个条件的元素的数组
[[2,3],[4,5]]
(我需要在循环中进一步使用它,这可能与问题相关或可能不相关)
我尝试了以下内容:
np.transpose([np.extract(a[:,0]>1,a[:,0]),np.extract(a[:,1]>2,a[:,1])])
只有当提取的数组长度相同时,上述方法才有效。即使它有效,它有时也会返回尚未配对的对(我明白为什么)
我知道如何在列表中执行此操作
list(filter(lambda b: b[0]>1 and b[1]>2,a))
但是,我想提高效率。所以我正在转向numpy(因为我读过它通常更有效率?) 有没有办法在numpy中执行上述操作,这比列表快得多? (我将使用包含100个元素的数组执行1000次代码。)
更新:关注Maarten_vd_Sande的回答:
以下代码用于检查所花费的时间:
import numpy as np
import time
b=np.random.rand(10000000,2)
a=b.tolist()
strt=time.time()
c=b[np.logical_and(b[:,0]>0.5,b[:,1]>0.5)]
for (i,j) in c:
continue
print("Numpy= ",time.time()-strt)
strt=time.time()
for (i,j) in list(filter(lambda m: m[0]>0.5 and m[1]>0.5,a)):
continue
print("List= ",time.time()-strt)
输出:
Numpy= 2.973170042037964
List= 1.91910982131958
答案 0 :(得分:1)
您需要在numpy中使用(logical) and:
result = a[np.logical_and(a[:,0] > 1, a[:,1] > 2)]
这对你有用吗?
修改强> 在这种情况下,我们甚至可以充分利用广播:
result = np.greater(a, [1, 2])