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 массивы или какой-то другой тип?

Другие вопросы по тегам