返回满足特定条件的2D numpy数组中的元素

时间:2018-03-30 07:37:01

标签: python numpy

我有一个(巨大的)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

1 个答案:

答案 0 :(得分:1)

您需要在numpy中使用(logical) and

result = a[np.logical_and(a[:,0] > 1,  a[:,1] > 2)]

这对你有用吗?

修改 在这种情况下,我们甚至可以充分利用广播:

result = np.greater(a, [1, 2])