Python 属性错误:';numpy.ndarray和#x27;对象没有属性';单位';

Python 属性错误:';numpy.ndarray和#x27;对象没有属性';单位';,python,numpy,attributes,attributeerror,metpy,Python,Numpy,Attributes,Attributeerror,Metpy,我正在使用一个新的Python包(metpy),它包含几个子包——其中一个子包使用以下代码定义梯度和风收敛: from __future__ import division import numpy as np from ..package_tools import Exporter from ..constants import g from ..units import atleast_2d, concatenate, units ### the 'units' and 'constan

我正在使用一个新的Python包(metpy),它包含几个子包——其中一个子包使用以下代码定义梯度和风收敛:

from __future__ import division
import numpy as np
from ..package_tools import Exporter
from ..constants import g
from ..units import atleast_2d, concatenate, units  
### the 'units' and 'constants' packages are within metpy

exporter = Exporter(globals())

def _gradient(f, *args, **kwargs):
    if len(args) < f.ndim:
        args = list(args)
        args.extend([units.Quantity(1., 'dimensionless')] * (f.ndim - len(args)))
    grad = np.gradient(f, *args, **kwargs)
    if f.ndim == 1:
        return units.Quantity(grad, f.units / args[0].units)
    return [units.Quantity(g, f.units / dx.units) for dx, g in zip(args, grad)]

def _stack(arrs):
    return concatenate([a[np.newaxis] for a in arrs], axis=0)


def _get_gradients(u, v, dx, dy):
# Helper function for getting convergence and vorticity from 2D arrays
    dudx, dudy = _gradient(u, dx, dy)
    dvdx, dvdy = _gradient(v, dx, dy)
    return dudx, dudy, dvdx, dvdy

def h_convergence(u, v, dx, dy):
    dudx, _, _, dvdy = _get_gradients(u, v, dx, dy)
return dudx + dvdy

我是Python新手,但据我所知,它试图从metpy.units包调用“units”,而不是从numpy调用?有人能提供建议吗?这不是我的代码,但我不知道为什么调用h_收敛函数时它不起作用。

您正在尝试获取
f
f.units
)的
units
属性,我假设
f
numpy.ndarray
类型
ndarray
s没有
units
属性,因此您会得到
AttributeError


您需要检查您作为
f
馈送到
\u梯度
的内容,它似乎是
u
v
来自
h\u收敛
。它们应该是
numpy
数组还是其他类型?

我刚刚尝试了相同的metpy软件包,但遇到了相同的问题:

AttributeError: 'numpy.ndarray' object has no attribute 'units' 
如果您查看metpy文档第1.2.1节“构造”,它们将解释如何构造这些单元

由于我也对融合感兴趣,我做了以下工作:

from metpy.units import units

u1 = u*units('m/s')
v1 = v*units('m/s')
然后,您应该为dx和dy设置相同的值:

dx = dlon * units('m')
dy = dlat * units('m')
最后一个电话是:

conv = calc.kinematics.h_convergence(u1,v1,dx,dy)

这似乎对我有用。

感谢您澄清问题所在。u和v是二维阵列。我能做些什么使它们兼容吗?对不起,我不知道;这不是我的密码。我想它是用品脱来转换单位的?抱歉,这是毫无帮助的-正如我说的,我是新手,只是查看预编写的脚本,尝试找出错误所在。我猜
metpy
定义了一个数组子类,一个添加了
units
等属性的子类。您的
u
v
需要使用该类进行构造。文档说明,u和v输入需要采用以下格式:u((X,Y)ndarray)–X风分量•v((X,Y)ndarray)–风的y分量…所以我假设它们是nArray就可以了?在示例中,看起来您必须手动添加单位,例如
u=u*units.knot
conv = calc.kinematics.h_convergence(u1,v1,dx,dy)