2010-12-09 64 views
8

让我们说,我们有一个数组如何根据其相对值操作numpy数组的每个元素?

a = np.array([10,30,50, 20, 10, 90, 0, 25]) 

的伪代码,因为我想要的东西 -

if a[x] > 80 then perform funcA on a[x] 
if 40 < a[x] <= 80 then perform funcB on a[x] 
if a[x] <= 40 then perform funcC on a[x] 

什么是使用numpy的函数来执行这个干净的方式?

+0

`funcA()`等可以用NumPy ufuncs表示吗?这些功能是做什么的? – 2010-12-09 17:15:36

+0

地图怎么样? – nmichaels 2010-12-09 17:18:23

回答

14

通常,您尝试避免使用NumPy数组的任何Python循环 - 这就是为什么您首先使用NumPy的原因。举例来说,我假设funcA()对所有元素加1,funcB()加2,​​加3(请详细说明他们真正为更多量身定制的例子做了些什么)。要达到你想要的,你可以这样做:

subset_a = a > 80 
subset_b = (40 < a) & (a <= 80) 
subset_c = a <= 40 
a[subset_a] += 1 
a[subset_b] += 2 
a[subset_c] += 3 

这使用NumPy advanced indexing。例如,a > 80评估为布尔值的数组,其可用于选择满足条件的阵列中的条目。

+1

你真的可以做'a [40 mtrw 2010-12-09 17:46:56

+0

@mtrw:你是对的,修好了。 – 2010-12-09 17:49:34

3

我喜欢这样的:

b = np.empty(a.shape) 
b[a < 40] = funcA(a[a < 40]) 
b[(a > 40) & (a <= 80)] = funcB(a[(a > 40) & (a <= 80)]) 
b[a > 80] = funcC(a[a > 80]) 

这避免了怪异的行为时funcA设置已被39至41,比如一个的a元素,从而将其带入范围funcB

8

看看numpy.piecewise。我想你想:

np.piecewise(a, [a > 80, (40 < a) & (a <= 80), a <= 40], [funcA, funcB, funcC]) 
0

如果您需要更复杂的功能,你可以使用

 newfunc=numpy.vectorize(lambda x: func(x)) 
     result=newfunc(yourArray) 

其中FUNC(x)是你的函数。

相关问题