'numpy.float64' не повторяется для центра масс функции scipy

Я пытаюсь рассчитать центр масс полей осадков по своим данным наблюдений (формат .nc), но постоянно получаю сообщение об ошибке: "TypeError: 'numpy.float64' object is not iterable"

Мне удалось преобразовать файл netcdf из .nc в набор данных xarray, а затем извлечь значения, чтобы получить массив (1, 90, 180), который я затем преобразовал в (90, 180) для других функциональные возможности. Затем я попытался вычислить центр масс для массива, но он продолжает выдавать мне сообщение об ошибке.

from scipy import ndimage

ncobsdata = Dataset('/home/data/20180380293.nc', mode = 'r')
obsdata = xr.open_dataset(xr.backends.NetCDF4DataStore(ncobsdata))
obs = obsdata.rain_total #shape = (1, 90, 180)

obsv = np.squeeze(obs) #I had to do this step to make it (90, 180)

CoM_obsv = ndimage.measurements.center_of_mass(obsv)

Я ожидаю получить результат центра масс, но я просто продолжаю получать сообщение об ошибке:

File "_____.py", line 10, in <module>
   CoM_obsv = ndimage.measurements.center_of_mass(obsv)
File "________/scipy/ndimage/measurements.py", line 1289, in center_of_mass
   return [tuple(v) for v in numpy.array(results).T]
TypeError: 'numpy.float64' object is not iterable

person a_sircar    schedule 15.08.2019    source источник
comment
Привет, добро пожаловать в СО! Какая строка в вашей трассировке дает TypeError: 'numpy.float64' object is not iterable? Обычно это означает, что вы пытаетесь выполнить итерацию по списку/итерируемому объекту, но объект, который вы передали, выглядит как один float64.   -  person PeptideWitch    schedule 15.08.2019
comment
Возможный дубликат объекта 'numpy.float64' не является итерируемым   -  person    schedule 15.08.2019
comment
Спасибо за редактирование. Похоже, ваша переменная obsv может быть не тем 2D-массивом, который вы ожидаете. Можете ли вы сделать быструю проверку печати: print(obsv) или print(obsv.shape), чтобы увидеть, что это такое?   -  person PeptideWitch    schedule 15.08.2019
comment
@PeptideWitch print(obsv.shape) дает результат (180, 270). Когда я делаю print (obsv), он говорит: <xarray.DataArray 'rain_total' (lat: 180, lon: 270)> с dtype=float32 Я изначально сказал (90, 180), но я не думал, что это выдаст мне сообщение об ошибке.   -  person a_sircar    schedule 15.08.2019
comment
Хорошо, взгляните на документацию Xarray, возможно, вам понадобится доступ к значениям объекта DataArray. Так что попробуйте: CoM_obsv = ndimage.measurements.center_of_mass(obsv.values)   -  person PeptideWitch    schedule 15.08.2019
comment
@PeptideWitch, это работает, большое спасибо!   -  person a_sircar    schedule 15.08.2019
comment
Рад помочь. Посетите xarray.pydata.org/en/stable/index.html, чтобы полный список всего, что вы можете сделать с этими объектами xarray - это может пригодиться в будущем, когда появятся подобные вещи.   -  person PeptideWitch    schedule 15.08.2019


Ответы (1)


Итак, здесь происходило то, что обе переменные obs и obsv хранятся как xarray.DataArrays — этот класс является оболочкой для обычных массивов numpy. Чтобы получить доступ к базовому np.ndarray, вам нужно будет вызвать значения из объекта:

CoM_obsv = ndimage.measurements.center_of_mass(obsv.values)

Обратите внимание, что вам не нужно делать это для obsv = np.squeeze(obs) #I had to do this step to make it (90, 180), поскольку для xarray.DataArrays уже доступен метод сжатия.

person PeptideWitch    schedule 15.08.2019