如何計算一個陣列在一個更大的陣列中出現的次數?
a = np. array([1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1] )
b = np.array([1, 1, 1] )
b在a中出現的次數的計數應該是3
。b可以是1和0的任意組合
我正在處理巨大的陣列,所以for回圈是相當慢的。uj5u.com熱心網友回復:
如果被搜索的子陣列包含所有的1,你可以通過用np.convolve對兩個陣列進行卷積,并計算結果中等于子陣列大小的條目數來計算子陣列出現的次數:
# 'valid' = convolve only over the complete overlap of the signals。
>>> np.convolve(a, b, mode='valid')
array([1, 1, 2, 3, 2, 2, 2, 3, 3, 2, 1, 1] )
# ^ ^ <= Matches
>>> win_size = min(a.size, b.size)
>>> np.count_nonzero(np.convolve(a, b) == win_size)
3
對于可能包含0的子陣列,你可以先用卷積法將a轉換為一個陣列,其中包含每個大小為b.size的視窗所編碼的二進制數字。然后,只需將轉換后的陣列中的每個元素與b編碼的二進制數進行比較,并計算出匹配數:
>>> b = np. array([0, 1, 1]) # encodes '3'/span>
>>> weights = 2 ** np.range(b.size) # == [1, 2, 4, 8, ..., 2**(b.size-1)]/span>
>>> np.convolve(a, weights, mode='valid'/span>)
array([4, 1, 3, 7, 6, 5, 3, 7, 7, 6, 4, 1] )
# ^ ^ 匹配。
>>> target = (b * np.flip(weights)).sum() # target=3
>>> np.count_nonzero(np.convolve(a, weights, mode='valid') == target)
2
uj5u.com熱心網友回復:
下面是一個使用串列理解的解決方案:
a = [1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1]
b = [1, 1, 1]
sum(a[i: i len(b)]==b for i in range(len(a)-len(b)))
輸出。3
uj5u.com熱心網友回復:
不是一個超級快的方法,但是你可以使用np.lib.stride_tricks.sliding_window_view來查看a作為一個視窗陣列:
window = np.lib.stride_tricks.sliding_window_view(a, b.shape)
你現在可以直接將其等同于b,并找到它們匹配的地方:
result = (window == b).all(-1).sum()
對于舊版本的numpy(1.20.0之前),你可以使用np.libs.stride_tricks.as_strided來達到類似的結果:
window = np.lib.stride_tricks.as_strided(
a, shape=(*(np.array(a.shape) - b.shape 1), *b.shape)。
strides=a.strides (a.strides[0], ) * b.ndim)
uj5u.com熱心網友回復:
下面是對@Brian的回答的一些改進:
使用np.correlate而不是np.convolve;它們幾乎是相同的,但是convolve以相反的方向讀取a和b。
a = np. array([1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1] )
b = np.array([0,1,1] )
np.correlate(a,2*b-1)
# array([-1, 1, 2, 1, 0, 0, 2, 1, 1, 0, -1, 1])
模板的配合,其中的關聯性等于模板中的1的數量。指數可以像這樣被提取出來:
(np.correlate(a,2*b-1)==np.count_nonzero(b)) 。
# array([2, 6])
如果你只需要計數,使用np.count_nonzero
np.count_nonzero((np.correlate(a,2*b-1)==np.count_nonzero(b))
# 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/332414.html
標籤:
