Numpy函数获取添加数组的形状

Numpy function to get shape of added arrays

tl;dr:我如何预测形状 return 通过跨多个数组的 numpy 广播而不必实际添加数组?

我有很多使用 numpy (Python) 广播规则的脚本,因此本质上是 1D 输入导致多维输出。对于一个基本示例,理想气体定律(压力 = 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,同时仍然允许脚本接受相同形状的数组并逐个元素地计算结果。

我的问题是:return 是否有内置函数可以兼容多种输入?表现得像

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

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

您可以使用 np.broadcast。这个函数 returns 一个对象封装了两个或多个数组一起广播的结果。不执行任何实际操作(例如加法)——该对象仅具有一些与通过其他操作生成的数组相同的属性(形状、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)

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

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

这意味着您可以按如下方式简单地实现您的功能:

def returnShape(*args):
    return np.broadcast(*args).shape