Я хочу округлить все значения в xarray до 2 знаков после запятой.
Я пробовал следующее:
def round_dim(data_arr):
data_arr.data = data_arr.data.round(decimals = 2)
return data_arr
Я называю это так:
data_values = <xarray.core.dataarray.DataArray>
data_values = round_dim(data_values)
Я бы ожидал, что data_values
теперь будет иметь те же значения, но округленные до 2 знаков после запятой, но этого не происходит.
РЕДАКТИРОВАТЬ
Когда я смотрю на данные, это выглядит следующим образом:
def round_dim(data_arr):
#(data_arr.values) is [-50.406578, -50.415337, -50.42315]
data_arr.data = data_arr.data.round(decimals = 2)
#(data_arr.values) is [-50.41, -50.42, -50.42]
return data_arr
Как видно после data_arr.data = data_arr.data.round(decimals = 2)
, я получаю правильное округление.
Тем не менее, делая:
data_values = <xarray.core.dataarray.DataArray>
data_values = round_dim(data_values)
print(data_values.values)
Вместо этого я не получаю правильные округленные значения:
[-50.409999, -50.419998, -50.419998]
Я ожидаю, что массив данных будет выглядеть как [-50.41, -50.42, -50.42]
эй, я понял проблему. Опубликовал свой ответ, спасибо за помощь
Если вы хотите применить round(decimals = 2)
ко всему набору данных, вы можете использовать xarray.Dataset.map.
Он возвращает копию исходного набора данных со всеми округленными данными, он не работает на месте.
import numpy as np
import xarray
dataset = xarray.Dataset()
dataset["a"] = xarray.DataArray(np.linspace(0, 1, 10))
dataset["b"] = xarray.DataArray(np.arange(10))
print(dataset)
# <xarray.Dataset>
# ...
# a (dim_0) float64 0.0 0.1111 0.2222 0.3333 ... 0.7778 0.8889 1.0
# b (dim_0) int32 0 1 2 3 4 5 6 7 8 9
def round_dim(dataset):
return dataset.map(lambda a: np.round(a, decimals=2))
dataset = round_dim(dataset)
print(dataset)
# <xarray.Dataset>
# ...
# a (dim_0) float64 0.0 0.11 0.22 0.33 0.44 0.56 0.67 0.78 0.89 1.0
# b (dim_0) int32 0 1 2 3 4 5 6 7 8 9
это возвращает только массив данных, а не массив данных, встроенный в xarray. например, я не могу вызвать .data
на data_values
после округления. Чтобы исправить это, я только что сделал data_values.data = round_dim(data_values)
Однако это по-прежнему не округляет большинство значений до 2 знаков после запятой. Я вижу следующее: [-62.740001678989, -62.75, -62.75, -62.7521368636]
Я считаю, что на самом деле происходит округление (как предполагают 2 значения -62.75
), но конечные числа все еще присутствуют, оно не полностью округляется до 2 знаков после запятой.
О, хорошо, вы хотите применить округление ко всему набору данных. Хорошо. Я отредактирую свой ответ с помощью .map
.
проблема в том, что лишние цифры. Округление работает, но лишние цифры после первых двух после запятой остаются. Не уверен, как избавиться от них. чтобы после запятой оставалось только 2 цифры.
Я добавил больше информации с редактированием вопроса
Таким образом, проблема была связана с dtype
данных. Очевидно, dtype
из float32
не ладит с .round
.
Чтобы решить эту проблему, я преобразовал данные в dtype
float64
с помощью .astype('float64')
, и округление работает, как и ожидалось.
Не могли бы вы привести минимальный воспроизводимый пример? Я не знаю, как вы создаете данные изначально.