Мне нужно применить очень простой «оператор соответствия» к значениям в массиве xarray:
- Где значение > 0, сделайте 2
- Где значение == 0, сделать 0
- Где значение
NaN
, сделайтеNaN
Вот мое текущее решение. Я использую NaN
s, .fillna
и приведение типов вместо двухмерной индексации.
valid = date_by_items.notnull()
positive = date_by_items > 0
positive = positive * 2
result = positive.fillna(0.).where(valid)
result
Это меняет это:
In [20]: date_by_items = xr.DataArray(np.asarray((list(range(3)) * 10)).reshape(6,5), dims=('date','item'))
...: date_by_items
...:
Out[20]:
<xarray.DataArray (date: 6, item: 5)>
array([[0, 1, 2, 0, 1],
[2, 0, 1, 2, 0],
[1, 2, 0, 1, 2],
[0, 1, 2, 0, 1],
[2, 0, 1, 2, 0],
[1, 2, 0, 1, 2]])
Coordinates:
* date (date) int64 0 1 2 3 4 5
* item (item) int64 0 1 2 3 4
... к этому:
Out[22]:
<xarray.DataArray (date: 6, item: 5)>
array([[ 0., 2., 2., 0., 2.],
[ 2., 0., 2., 2., 0.],
[ 2., 2., 0., 2., 2.],
[ 0., 2., 2., 0., 2.],
[ 2., 0., 2., 2., 0.],
[ 2., 2., 0., 2., 2.]])
Coordinates:
* date (date) int64 0 1 2 3 4 5
* item (item) int64 0 1 2 3 4
В то время как в пандах df[df>0] = 2
было бы достаточно. Конечно, я делаю что-то пешеходное, и есть более лаконичный способ?