在执行numpy广播操作时应用元素规则

时间:2019-05-09 19:02:36

标签: python numpy numpy-broadcasting

我想将两个数字numpy对象tspeed相乘而又不知道每个对象是标量还是数组的先验。问题在于0是t(或t元素的合法值),而infspeed(或{{元素的)合法值1}})。在这种情况下,我正在使用的模型有一条规则:在速度为无穷大且speed为零的情况下,乘积定义为0。

我的问题是在应用规则时要同时处理两个操作数的可能标量(可能不是标量)。到目前为止,我能想到的最好的方法就是这个丑陋的层叠:

t

我不禁要想,我必须缺少一种更高效,更Numpythonic的方式。有吗?

2 个答案:

答案 0 :(得分:1)

0 * np.inf抛出RuntimeWarning并求值为np.nan 仅执行乘法,然后替换np.nan怎么样?

import numpy as np

def multiply(a, b):
    temp = np.array(a*b)
    temp[np.isnan(temp)] = 0
    return temp

测试:

np.random.seed(123)
t = np.random.rand(10)
t[0] = 0
speed = np.random.rand(10)
speed[0] = np.inf
speed[6] = np.inf

输入:

multiply(t, speed)

输出:

array([ 0.        ,  0.09201602,  0.02440781,  0.49796297,  0.06170694,
    0.57372377,         inf,  0.03658583,  0.53141369,  0.1746193 ])

答案 1 :(得分:0)

已经过了几天,没有人写下hpaulj和SubhaneilLahiri的评论中给出的答案,所以我最好自己做。我之所以将其设为可接受的答案,是因为它足以解决问题的标题,即使在超出问题给出的特定模型的情况下也是如此。

# prepare zeros of the correct shape:
out = np.zeros(np.broadcast(t, speed).shape), dtype=float)

# write the product values into the prepared array, but ONLY
# according to the mask t!=0 
np.multiply(t, speed, where=t!=0, out=out)

在该问题的特定模型中,对于测试t!=0失败的所有地方,预先准备好的默认输出值0已经正确:无论如何,0 * speed都是0 {1}}是有限的,并且当speed是无限的时,它也是0(根据模型规则)。但是这种方法适用于更一般的情况:原则上,可以使用其他numpy ufunc调用来填充具有任意不同规则的结果的输出数组的被屏蔽部分。