我正在使用一个新的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
当我尝试使用函数h_convergence时,我在这一行得到以下错误:
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)]
AttributeError: 'numpy.ndarray' object has no attribute 'units'
我是Python的新手,但据我所知,它试图从metpy调用'units'。单位包装,而不是从numpy?有人能给点建议吗?这不是我的代码,但我不知道为什么当我调用h_convergence函数时它不工作。
我刚刚尝试了相同的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)
您正试图获得f
(f.units
)的units
属性,我假设f
为numpy.ndarray
类型。ndarray
s没有units
属性,所以您得到AttributeError
.
您需要检查您为_gradient
提供的f
,这似乎是h_convergence
的u
或v
。它们是指numpy
数组,还是其他类型?