我試圖X用np.nan除了包含值的行和列替換輸入矩陣的所有值v:

import numpy as np
from numpy.typing import NDArray
def get_masked_array(X: NDArray[float], v: float) -> NDArray[float]:
# something
return arr
# Input float array
X = np.array([[ 1., 2., 2., 3., 3.],
[ 1., 2., 2., 4., 4.],
[ 5., 5., 6., 6., 6.],
[ 7., 8., 9., 9., 9.],
[10., 10., 10., 10., 10.]])
預期成績:
>>> get_masked_array(X, 2.)
array([[ 1., 2., 2., 3., 3.],
[ 1., 2., 2., 4., 4.],
[nan, 5., 6., nan, nan],
[nan, 8., 9., nan, nan],
[nan, 10., 10., nan, nan]])
>>> get_masked_array(X, 3.)
array([[ 1., 2., 2., 3., 3.],
[nan, nan, nan, 4., 4.],
[nan, nan, nan, 6., 6.],
[nan, nan, nan, 9., 9.],
[nan, nan, nan, 10., 10.]])
uj5u.com熱心網友回復:
首先檢查行和列條件,然后利用numpy 廣播將它們組合成一個布爾條件:
v = 2
eq_v = X == v
has_v = eq_v.any(0) | eq_v.any(1, keepdims=True) # check if row or col has v
np.where(has_v, X, np.nan)
array([[ 1., 2., 2., 3., 3.],
[ 1., 2., 2., 4., 4.],
[nan, 5., 6., nan, nan],
[nan, 8., 9., nan, nan],
[nan, 10., 10., nan, nan]])
使用walrus 運算子(>= python 3.8),您可以高效地在一行中執行此操作:
np.where((eq_v := (X == v)).any(0) | eq_v.any(1, keepdims=True), X, np.nan)
array([[ 1., 2., 2., 3., 3.],
[ 1., 2., 2., 4., 4.],
[nan, 5., 6., nan, nan],
[nan, 8., 9., nan, nan],
[nan, 10., 10., nan, nan]])
uj5u.com熱心網友回復:
這會奏效,但我相信有更簡單的方法:
v = 2
rows, cols = map(np.unique, np.argwhere(X == v).T)
N = np.empty(X.shape, float)
N[:] = np.nan
N[rows, :] = X[rows, :]
N[:, cols] = X[:, cols]
輸出:
array([[ 1., 2., 2., 3., 3.],
[ 1., 2., 2., 4., 4.],
[nan, 5., 6., nan, nan],
[nan, 8., 9., nan, nan],
[nan, 10., 10., nan, nan]])
對于v = 3:
array([[ 1., 2., 2., 3., 3.],
[nan, nan, nan, 4., 4.],
[nan, nan, nan, 6., 6.],
[nan, nan, nan, 9., 9.],
[nan, nan, nan, 10., 10.]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/316961.html
上一篇:Python比較兩列
