我有一個這樣的陣列arorg
:如何根據條件有效地將函數應用於數組中的值?
import numpy as np
arorg = np.array([[-1., 2., -4.], [0.5, -1.5, 3]])
和另一個陣列values
看起來如下:
values = np.array([1., 0., 2.])
values
具有相同數目的條目作爲arorg
具有列。
現在我想申請功能項或arorg
取決於他們是否是正面或負面的:
def neg_fun(val1, val2):
return val1/(val1 + abs(val2))
def pos_fun(val1, val2):
return 1./((val1/val2) + 1.)
因此,val2
是arorg
和val1
(絕對)值 - 這是棘手的部分 - 來自values
;如果我將pos_fun
和neg_fun
應用於i
列arorg
,val1
應該是values[i]
。
我目前執行的是如下:
ar = arorg.copy()
for (x, y) in zip(*np.where(ar > 0)):
ar.itemset((x, y), pos_fun(values[y], ar.item(x, y)))
for (x, y) in zip(*np.where(ar < 0)):
ar.itemset((x, y), neg_fun(values[y], ar.item(x, y)))
這給了我想要的輸出:
array([[ 0.5 , 1. , 0.33333333],
[ 0.33333333, 0. , 0.6 ]])
正如我不得不經常做這些計算,我想知道是否有更這樣做的有效方法。像
np.where(arorg > 0, pos_fun(xxxx), arorg)
東西將是巨大的,但我不知道如何正確地傳遞參數(該xxx
)。有什麼建議麼?
對於'[0,0]'返回值的項目,答案應該是'inf'嗎? 'arorg [0,0]'是負數,所以我們應用'neg_fun',其分母爲0。 'val1 /(val1 + val2)= 1 /(1 - 1)' – James
@James:'arorg [0,0]'是'-1',所以我們的確應用了'neg_fun'; 'values [0]'是'1'。然後我們會得到:'1。 /(1. + abs(-1))= 0.5'。你在哪裏看到'inf'? – Cleb
對於[0,3]項目,結果應爲-1(2 /( - 4 + 2))? – Allen