我有一個非常大的整數numpy.array
,其中每個整數的範圍是[0, 31]
。計算整數y在numpy數組中整數x之後的頻率
我想計數,對於在範圍[0, 31]
(例如[0, 1], [7, 9], [18, 0]
)每對整數(a, b)
的頻率b
a
之後發生。
這會給我一個(32, 32)
計數矩陣。
我正在尋找一種有效的方式來做到這一點與numpy。原始的python循環會太慢。
我有一個非常大的整數numpy.array
,其中每個整數的範圍是[0, 31]
。計算整數y在numpy數組中整數x之後的頻率
我想計數,對於在範圍[0, 31]
(例如[0, 1], [7, 9], [18, 0]
)每對整數(a, b)
的頻率b
a
之後發生。
這會給我一個(32, 32)
計數矩陣。
我正在尋找一種有效的方式來做到這一點與numpy。原始的python循環會太慢。
這裏有一種方法......
爲了使示例更容易閱讀,我將使用的9,而不是31最大值:
In [178]: maxval = 9
做了例如隨機輸入:
In [179]: np.random.seed(123)
In [180]: x = np.random.randint(0, maxval+1, size=100)
創建的結果,最初所有0:
In [181]: counts = np.zeros((maxval+1, maxval+1), dtype=int)
現在加入1到每個座標對,使用numpy.add.at
,以確保重複的系統正確計算:
In [182]: np.add.at(counts, (x[:-1], x[1:]), 1)
In [183]: counts
Out[183]:
array([[2, 1, 1, 0, 1, 0, 1, 1, 1, 1],
[2, 1, 1, 3, 0, 2, 1, 1, 1, 1],
[0, 2, 1, 1, 4, 0, 2, 0, 0, 0],
[1, 1, 1, 3, 3, 3, 0, 0, 1, 2],
[1, 1, 0, 1, 1, 0, 2, 2, 2, 0],
[1, 0, 0, 0, 0, 0, 1, 1, 0, 2],
[0, 4, 2, 3, 1, 0, 2, 1, 0, 1],
[0, 1, 1, 1, 0, 0, 2, 0, 0, 3],
[1, 2, 0, 1, 0, 0, 1, 0, 0, 0],
[2, 0, 2, 2, 0, 0, 2, 2, 0, 0]])
例如,次6的數目隨後用1是
In [188]: counts[6, 1]
Out[188]: 4
我們可以用下面的表達式來驗證:
In [189]: ((x[:-1] == 6) & (x[1:] == 1)).sum()
Out[189]: 4
您可以將numpy的內置diff
例程與布爾數組一起使用。
import numpy as np
test_array = np.array([1, 2, 3, 1, 2, 4, 5, 1, 2, 6, 7])
a, b = (1, 2)
sum(np.bitwise_and(test_array[:-1] == a, np.diff(test_array) == b - a))
# 3
如果您的數組是多維的,您需要首先對其進行平整或對上述代碼進行一些小修改。
謝謝你的回答:)即使你的解決方案是優雅的,它實際上比生python循環。 – valentin
這是一個非常優雅的解決方案。雖然我需要調查這個numpy函數實際上是如何工作的,以瞭解發生了什麼! – valentin