2017-04-26 42 views
2

我有一個這樣的陣列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.) 

因此,val2arorgval1(絕對)值 - 這是棘手的部分 - 來自values;如果我將pos_funneg_fun應用於iarorg,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,0]'返回值的項目,答案應該是'inf'嗎? 'arorg [0,0]'是負數,所以我們應用'neg_fun',其分母爲0。 'val1 /(val1 + val2)= 1 /(1 - 1)' – James

+0

@James:'arorg [0,0]'是'-1',所以我們的確應用了'neg_fun'; 'values [0]'是'1'。然後我們會得到:'1。 /(1. + abs(-1))= 0.5'。你在哪裏看到'inf'? – Cleb

+0

對於[0,3]項目,結果應爲-1(2 /( - 4 + 2))? – Allen

回答

2

正如問題所暗示的,這裏有一個使用np.where

首先,我們使用函數實現的直接翻譯來爲正面和負面情況生成值/數組。然後,使用正值的掩碼,我們將使用np.where在這兩個數組之間進行選擇。

因此,實現起來看看這些方針的東西 -

# Get positive and negative values for all elements 
val1 = values 
val2 = arorg 
neg_vals = val1/(val1 + np.abs(val2)) 
pos_vals = 1./((val1/val2) + 1.) 

# Get a positive mask and choose between positive and negative values 
pos_mask = arorg > 0 
out = np.where(pos_mask, pos_vals, neg_vals) 
+0

工作正常,謝謝(upvoted)。 – Cleb

1

你並不需要應用的功能陣列的壓縮元素,你可以通過簡單的數組操作和切片完成同樣的事情。

首先,得到正面和負面的計算,保存爲數組。然後,創建的零的回陣列(只是作爲缺省值),以及使用的posneg布爾切片填充它:

import numpy as np 
arorg = np.array([[-1., 2., -4.], [0.5, -1.5, 3]]) 
values = np.array([1., 0., 2.]) 

pos = 1./((values/arorg) + 1) 
neg = values/(values + np.abs(arorg)) 

ret = np.zeros_like(arorg) 
ret[arorg>0] = pos[arorg>0] 
ret[arorg<=0] = neg[arorg<=0] 

ret 
# returns: 
array([[ 0.5  , 1.  , 0.33333333], 
     [ 0.33333333, 0.  , 0.6  ]]) 
+0

工作正常,謝謝(upvoted)。 – Cleb

1
import numpy as np 
arorg = np.array([[-1., 2., -4.], [0.5, -1.5, 3]]) 
values = np.array([1., 0., 2.]) 
p = 1.0/(values/arorg+1) 
n = values/(values+abs(arorg)) 
#using np.place to extract negative values and put them to p 
np.place(p,arorg<0,n[arorg<0]) 
print(p) 
[[ 0.5   1.   0.33333333] 
[ 0.33333333 0.   0.6  ]] 
+0

工作正常,謝謝(upvoted)!只是一件小事:'a'沒有定義,應該是'arorg'。 – Cleb

+0

你說得對。已更新。 – Allen

相關問題