2 回答

TA貢獻(xiàn)1895條經(jīng)驗 獲得超7個贊
您可以將元素與其列式分鐘進(jìn)行比較,然后將大小寫為 uint8 以節(jié)省一些空間:
>>> import numpy as np
>>> np.random.seed(444)
>>> arr = np.random.rand(10, 4)
>>> (arr == arr.min(axis=0)).astype(np.uint8)
array([[0, 0, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 1],
[0, 1, 0, 0],
[0, 0, 1, 0]], dtype=uint8)
由于 NumPy 的廣播,比較arr == arr.min(axis=0)會產(chǎn)生與 的形狀相同的結(jié)果arr,即使arr.min(axis=0)會有形狀(4,)。
請注意,如果列有重復(fù)的最小值,這可能會在單個列中生成多個“1”。

TA貢獻(xiàn)1853條經(jīng)驗 獲得超9個贊
這里有很多選項,例如:
1) 預(yù)先初始化掩碼并使用argmin填入合適的地方:
arr = np.random.rand(10, 4)
indices = np.argmin(arr, axis=0)
mask = np.zeros_like(arr, dtype=np.int)
mask[indices, range(len(indices))] = 1
2) Usingapply_along_axis可能是你喜歡的風(fēng)格:
def is_minimum(v):
return v == np.min(v)
mask = np.apply_along_axis(is_minimum, axis=0, arr=arr).astype(np.int)
這些解決方案假設(shè)每一列對應(yīng)一個唯一的鍵。
添加回答
舉報