給定一個 numpy 布爾陣列
arr = np.array([1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1])
我想指出哪里至少有n連續的真值(從左到右)。
對于n = 2:
# True 2x (or more) in a row
# / \ / \
arr = [1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1]
# becomes:
res = [0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0]
# ^-----------^--^-------- A pattern of 2 or more consecutive True's ends at each of these locations
對于n = 3:
# True 3x (or more) in a row
# / \
arr = [1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1]
# becomes:
res = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
# ^-------- A pattern of 3 or more consecutive True's ends at this location
在不使用 for 回圈迭代每個元素的情況下,是否有一種 pythonic 方法?性能在這里很重要,因為我的應用程式將對包含 1000 個元素的布爾陣列執行 1000 次此操作。
值得一提的注意事項:
- n可以是大于 2 的任何值
- n -連續模式可以出現在陣列中的任何位置;開始、中間或結束。
- 結果陣列的形狀必須與原始陣列的形狀相匹配。
任何幫助將不勝感激。
uj5u.com熱心網友回復:
您可以將每個元素與其前身進行比較,然后將結果乘以原始值。這將為您提供兩個或更多序列的 1s。再做一次以獲得 3 個或更多的序列:
import numpy as np
arr = np.array([1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1])
arr[1:] *= arr[1:] == arr[:-1] # two consecutive
arr[0] = 0 # 1st '1' isn't a two-consec.
arr[1:] *= arr[1:] == arr[:-1] # three consecutive
print(arr)
[0 0 0 0 0 0 0 0 1 0 0]
uj5u.com熱心網友回復:
您可以使用填充/移動序列numpy.pad并與前一個值進行比較,最后乘以原始值以僅保留 1:
b = np.pad(arr, (1,0), constant_values=0)[:-1]
# b: array([0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0])
(arr==b)*arr
輸出: array([0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0])
通用解決方案:
n = 3
(sum([np.pad(arr, (i, 0), constant_values=0)[:len(arr)]
for i in range(n)]) == n)*arr
輸出: array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0])
注意。這里的訣竅是sum移位值,如果 n 個先前的值為 1,則總和為 n
uj5u.com熱心網友回復:
僅 Numpy:
from numpy.lib.stride_tricks import sliding_window_view
arr = np.array([1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1])
res = sliding_window_view(arr , window_shape = 3).all(axis=1) # window_shape <- n
>>> array([False, False, False, False, False, False, True, False, False])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/352942.html
下一篇:在imshow上疊加等高線圖
