0

我有这个玩具示例,我使用 pint 和 numpy -

import numpy as np

from pint import UnitRegistry

ureg = UnitRegistry()

Q_ = ureg.Quantity

args = []

for k in range(0,17):
   uwnd = Q_(np.ones((1,73,144)),'meter / second')
    args.append(uwnd)
uwndTot = np.vstack(args)
print(uwndTot.shape)
for element in args:
   print(type(element))

uwndTot 的形状是

 (17,73,144)

如上图 args 中元素的类型为

<class 'pint.quantity.build_quantity_class.<locals>.Quantity'>

但是,如果我以以下方式打印出 uwndTot 的类型,我会得到

 for element in uwndTot:
    print(type(element))

我明白了

 <class 'numpy.ndarray'>

所以我无法从这个过程中提取 uwnd 的单位。这是正确的行为吗?为什么我发出呼叫时类型会改变

  np.vstack(args)

或者

 np.concatenate(args,axis = 0)

我希望能够使用 vstack 或连接。还有其他方法吗?

更新 我有一堆 netCDF 文件,当我读入时,它们的形状(73,144)。我需要连接它们中的“n”个,这会给我一个形状的 numpy 数组(17,73,144)。那些 netCDF 文件的单位是米/秒或其他单位。我的计算中需要这些单位。

4

1 回答 1

1

这是我们在 MetPy 中使用的方法,确保所有源数组都具有兼容的维度:

def concatenate(arrs, axis=0):
    dest = 'dimensionless'
    for a in arrs:
        if hasattr(a, 'units'):
            dest = a.units
            break

    data = []
    for a in arrs:
        if hasattr(a, 'to'):
            a = a.to(dest).magnitude
        data.append(np.atleast_1d(a))

    return units.Quantity(np.concatenate(data, axis=axis), dest)
于 2018-03-16T01:02:21.833 回答