簡體   English   中英

替換 2D numpy 數組中第一次出現的 0

[英]Replace first occurence of 0 in a 2D numpy array

我有一個二維數組:

[[1,2,0,0],
[4,0,9,4],
[0,0,1,0],
[4,6,9,0]]

是否有一種有效的方法(不使用循環)將數組中的每個第一個 0 替換為 1:

[[1,2,1,0],
[4,1,9,4],
[1,0,1,0],
[4,6,9,1]]

?

非常感謝 !

因此,您可以使用np.where獲取數組為 0 的行和列的索引:

In [45]: arr = np.array(
    ...:    [[1,2,0,0],
    ...:     [4,0,9,4],
    ...:     [0,0,1,0],
    ...:     [4,6,9,0]]
    ...: )

In [46]: r, c = np.where(arr == 0)

然后,使用np.unique獲取唯一的 x 值,這將對應於每行中第一次出現的0 ,並使用return_index獲取索引以提取相應的列值:

In [47]: uniq_val, uniq_idx = np.unique(r, return_index=True)

In [48]: arr[uniq_val, c[uniq_idx]] = 1

In [49]: arr
Out[49]:
array([[1, 2, 1, 0],
       [4, 1, 9, 4],
       [1, 0, 1, 0],
       [4, 6, 9, 1]])

如果性能真的是一個問題,你可以寫一個numba function,我懷疑這對numba來說是非常適合的

這是一個受這個問題的公認答案啟發的單行代碼:

a = np.array([
    [1, 2, 0, 0],
    [4, 0, 9, 4],
    [0, 0, 1, 0],
    [4, 6, 9, 0]
])
a[range(len(a)), np.argmax(a == 0, axis=1)] = 1

我不確定這是否有效,但至少比循環好。 我們搜索每行中的第一個 0,然后將其擴展到坐標並將其設置為 1。

filter = np.argmax(a == 0, axis=1)
f = np.column_stack((np.array(range(4)),filter))
a[[*f.T]] = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM