AttributeError: у объекта 'numpy.ndarray' нет атрибута 'единиц'
Я использую новый пакет 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.
2 ответа
Я только что попробовал тот же пакет 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)
Кажется, это работает для меня.
Ты пытаешься получить units
атрибут f
(f.units
), где я предполагаю f
имеет тип numpy.ndarray
, ndarray
с не имеют units
атрибут, так что вы получите AttributeError
,
Вы должны проверить, что вы кормите _gradient
как f
, который, кажется, u
или же v
от h_convergence
, Они должны быть numpy
массивы или какой-то другой тип?