【发布时间】:2017-09-23 19:57:35
【问题描述】:
我有一个这样的数组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 应用于arorg 中的i 列,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:
arorg[0, 0]是-1,所以我们确实申请了neg_fun;values[0]是1.。然后我们会得到:1. / (1. + abs(-1)) = 0.5。你在哪里看到inf? -
同样对于[0,3]项,结果应该是-1 (2/(-4+2))吗?
-
您的函数中没有包含
abs -
在你的 func def 中,没有 abs()
标签: python arrays performance numpy vectorization