2010-12-09 61 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)是你的函數。

相關問題