1

在numpy中根据复杂条件选择和重新分配元素的最快方法是什么,例如:

# some 1-d array of floats
myarray = np.array(myarray)
# set any foo's or bar's from myarray to 0
myarray[where(map(lambda x: foo(x) or bar(x), myarray))] = 0

是使用的解决方案np.vectorize吗?或者np.select也许?

4

2 回答 2

1

最快的可能是对包含所有条件的数组使用花哨的索引:

import numpy as np
x = np.arange(1000)
cond1 = x % 2 == 0      # getting the even numbers
cond2 = x**0.5 % 1 == 0 # getting those with exact square root
cond3 = x % 3 == 0      # getting those divisible by 3
cond =np.all(np.array((cond1,cond2,cond3)),axis=0)
print x[ cond ]
#[  0  36 144 324 576 900] 

使用np.all意味着 cond1 和 cond2 和 cond3。

使用np.any意味着 cond1 或 cond2 或 cond3。

如果所有条件都在预定义的布尔数组中创建,这会更快:

conds = np.zeros((3,1000),dtype='bool')

然后将每个条件分配给数组中的一行。

于 2013-05-19T10:13:12.937 回答
0

也可以使用 np.where():

In [7]: a[np.where((a % 2 == 0) & (a % 3 == 0) & (a ** 0.5 % 1 == 0))]
Out[7]: array([  0,  36, 144, 324, 576, 900])
于 2013-05-21T16:54:30.920 回答