Округление и перезапись данных xarray на месте

Я хочу округлить все значения в 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]

Не могли бы вы привести минимальный воспроизводимый пример? Я не знаю, как вы создаете данные изначально.

Guimoute 10.01.2023 21:09

эй, я понял проблему. Опубликовал свой ответ, спасибо за помощь

user20816596 12.01.2023 01:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите применить 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 знаков после запятой.

user20816596 10.01.2023 17:38

О, хорошо, вы хотите применить округление ко всему набору данных. Хорошо. Я отредактирую свой ответ с помощью .map.

Guimoute 10.01.2023 18:55

проблема в том, что лишние цифры. Округление работает, но лишние цифры после первых двух после запятой остаются. Не уверен, как избавиться от них. чтобы после запятой оставалось только 2 цифры.

user20816596 10.01.2023 19:11

Я добавил больше информации с редактированием вопроса

user20816596 10.01.2023 19:57
Ответ принят как подходящий

Таким образом, проблема была связана с dtype данных. Очевидно, dtype из float32 не ладит с .round.

Чтобы решить эту проблему, я преобразовал данные в dtypefloat64 с помощью .astype('float64'), и округление работает, как и ожидалось.

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