给定以下矩阵:
matrix = np.array([[0,np.nan,1],[np.nan,np.nan,np.nan],[1,2,3]])
我想获取最小行值的数组。如果一行包含所有 nan 值,则该行所有 nan 值的索引应为 0。reslting 数组应为。
array([0,0,0])
如果我尝试使用
np.argmin(matrix,axis=1)
那么最小索引就是 np.nan 出现的地方,例如:
array([1, 0, 0])
这是不希望的,如果我使用
np.nanargmin(matrix,axis=1)
我会得到 raise ValueError("All-NaN slice encountered")
numpy.nan_to_num
用无穷大填充 NaN,然后得到 argmin
:
np.argmin(np.nan_to_num(matrix, nan=float('inf')), axis=1)
输出:
array([0, 0, 0])
您可以将数组转换为屏蔽数组,其中所有 np.nan 都被屏蔽,然后获取该数组的 argmin:
np.ma.masked_invalid(matrix).argmin(axis=1)
输出:
array([0, 0, 0], dtype=int64)
这里是使用
np.inf
的哨兵值(例如 xarray
)填充或填充数据的替代方法。它可能适合任何对 np.nanargmin
docs 中的警告持谨慎态度的人,该警告指出:“如果切片仅包含 NaN 和 Infs,则结果不可信。”
xarray.DataArray.idxmin
方法与np.nanargmin
类似,但返回最小值的坐标而不是其位置。如果坐标是位置,那么此方法几乎与np.nanargmin
相同。不同之处在于 xarray.DataArray.idxmin
让您为全 NaN 切片设置 fill_value
。
import numpy as np
import xarray as xr
matrix = np.array([[0, np.nan, 1],[np.nan, np.nan, np.nan], [1, 2, 3]])
da = xr.DataArray(matrix, coords={"foo": [0, 1, 2], "bar": [0, 1, 2]})
da.idxmin(dim="bar", fill_value=0)
<xarray.DataArray 'bar' (foo: 3)> Size: 24B
array([0, 0, 0])
Coordinates:
* foo (foo) int64 24B 0 1 2