Python Условный массив данных .where () сохраняет значения nan, но превращает отрицательные значения в 0 - PullRequest
0 голосов
/ 19 июня 2020

У меня эта проблема уже несколько часов, не могу решить ее. У меня есть массив данных xarray со значениями nan (numpy .float32), положительными и отрицательными значениями (numpy .float32). Теперь я хочу превратить отрицательные значения в 0 - ТОЛЬКО ЭТО. Но даже такую, казалось бы, простую задачу мне решить невозможно. Например, это то, с чем я работал. (xarray.core.dataarray.DataArray) type.

Предыдущий код:

path = r'D:\....'
dObj = xr.open_dataset(path)
JJA = dObj ['cba'].sel(time=dObj.time.values)

Объект тогда выглядит следующим образом: (Мне очень жаль, что я не могу предоставить. n c файл, поскольку он составляет 200 МБ, и я понятия не имею, как его соответственно нарезать)

enter image description here

JJA

enter image description here

Мое решение было:

JJA = JJA.where(JJA>0,0)

Но каким-то образом это превращает отрицательные значения AND nan в 0, не знаю почему. Затем я пробовал разные подходы и немного усложнил условное выражение.

JJA = JJA.where((np.isnan(JJA)==False)&(JJA > 0),0)

Но ничего, он все равно превращается в:

JJA

enter image description here

1 Ответ

1 голос
/ 19 июня 2020

Как указано в xarray docs , строка типа JJA = JJA.where(JJA>0,0) вернет DataArray с сохраненными значениями, которые соответствуют cond (т.е. JJA>0), и вернет 0 для все остальное . Вот почему он заменяет все, что не соответствует этому условию (включая NaN, ноль и отрицательные значения), на 0.

Причина, по которой ваша более сложная маска не работает, заключается в том, что вы используете AND вместо OR. Если вы хотите установить только отрицательные значения на ноль и оставить только NaN, вы можете сделать что-то вроде: JJA = JJA.where((JJA > 0) | JJA.isnull(), 0)

...