5

tl; dr:如何预测 numpy 在多个数组中广播返回的形状,而无需实际添加数组?

我有很多使用 numpy (Python) 广播规则的脚本,因此基本上一维输入会产生多维输出。举个基本的例子,理想气体定律(压力 = rho * R_d * 温度)可能看起来像

def rhoIdeal(pressure,temperature):
    rho = np.zeros_like(pressure + temperature)
    rho += pressure / (287.05 * temperature)
    return rho

这里没有必要,但在更复杂的函数中,用正确的形状初始化数组非常有用。如果压力和温度具有相同的形状,则 rho 也具有该形状。如果压力具有形状 (n,) 而温度具有形状 (m,),我可以调用

rhoIdeal(pressure[:,np.newaxis], temperature[np.newaxis,:])

得到形状为 (n,m) 的 rho。这让我无需循环就可以绘制具有多个温度值的图rhoIdeal,同时仍然允许脚本接受相同形状的数组并逐个元素地计算结果。

我的问题是:是否有一个内置函数可以返回与多个输入兼容的形状?行为类似的东西

def returnShape(list_of_arrays):
    return np.zeros_like(sum(list_of_arrays)).shape

实际上不必对数组求和?如果没有内置函数,一个好的实现会是什么样子?

4

1 回答 1

6

你可以使用np.broadcast. 此函数返回一个对象,该对象封装了一起广播两个或多个数组的结果。不执行实际操作(例如加法) - 对象仅具有一些与通过其他操作生成的数组相同的属性(形状、ndim 等)。

例如:

x = np.array([1,2,3])  # shape (3,)
y = x.reshape(3,1)     # shape (3, 1)
z = np.ones((5,1,1))   # shape (5, 1, 1)

然后您可以检查广播返回的数组的形状xyz通过检查 shape 属性:

>>> np.broadcast(x, y, z).shape
(5, 3, 3)

这意味着您可以简单地实现您的功能,如下所示:

def returnShape(*args):
    return np.broadcast(*args).shape
于 2015-08-07T14:00:38.080 回答