我有一個numpy數組,其中包含各種熱編碼numpy數組,例如:統計數組中出現的唯一數組
x = np.array([[1, 0, 0], [0, 0, 1], [1, 0, 0]])
我想統計每個唯一一個熱載體的occurances,
{[1, 0, 0]: 2, [0, 0, 1]: 1}
我有一個numpy數組,其中包含各種熱編碼numpy數組,例如:統計數組中出現的唯一數組
x = np.array([[1, 0, 0], [0, 0, 1], [1, 0, 0]])
我想統計每個唯一一個熱載體的occurances,
{[1, 0, 0]: 2, [0, 0, 1]: 1}
方式# 1
看起來像一個完美的設置t o使用的numpy.unique
(V1.13和更新的)的新的功能,讓我們沿着NumPy的陣列的軸工作 -
unq_rows, count = np.unique(x,axis=0, return_counts=1)
out = {tuple(i):j for i,j in zip(unq_rows,count)}
樣品輸出 -
In [289]: unq_rows
Out[289]:
array([[0, 0, 1],
[1, 0, 0]])
In [290]: count
Out[290]: array([1, 2])
In [291]: {tuple(i):j for i,j in zip(unq_rows,count)}
Out[291]: {(0, 0, 1): 1, (1, 0, 0): 2}
方法2
對於年齡大於v1.13
的NumPy版本,我們可以利用輸入數組是單熱編碼d數組,如下所示 -
_, idx, count = np.unique(x.argmax(1), return_counts=1, return_index=1)
out = {tuple(i):j for i,j in zip(x[idx],count)} # x[idx] is unq_rows
注意''axis'被添加到1.13的numpy中,所以以前的版本不能使用這種方法.. – TemporalWolf
方法#2可能更適合單熱陣列的'np.eye'技巧。 'u,count = np.unique(x.argmax(1),return_counts = 1)','i = np.eye(np.max(u))','out = {i [u]:j for i ,j in zip(u,count)}'。這樣你就不需要'return_index'或者在你的循環中索引一個大的熱門向量。也歡迎'np.unique(...,axis)'! –
然後我們可以回到@TemporalWolf的答案,並意識到當我們可以在第二個軸上進行求和時,我們正在浪費我們的時間來做'np.unique'。 –
您可以將您的陣列轉換成元組,並使用Counter
:
import numpy as np
from collections import Counter
x = np.array([[1, 0, 0], [0, 0, 1], [1, 0, 0]])
Counter([tuple(a) for a in x])
# Counter({(1, 0, 0): 2, (0, 0, 1): 1})
列表(包括numpy數組)不可以被使用,即它們不能是字典的鍵。因此,您的精確期望的輸出,在Python中永遠不可能使用鍵字爲[1, 0, 0]
的字典。要處理這個問題,你需要將你的向量映射到元組。
from collections import Counter
import numpy as np
x = np.array([[1, 0, 0], [0, 0, 1], [1, 0, 0]])
counts = Counter(map(tuple, x))
,將讓你:
In [12]: counts
Out[12]: Counter({(0, 0, 1): 1, (1, 0, 0): 2})
這裏是總和
>> {tuple(v): n for v, n in zip(np.eye(x.shape[1], dtype=int), np.sum(x, axis=0))
if n > 0}
{(0, 0, 1): 1, (1, 0, 0): 2}
不錯。我認爲我們的答案正在收斂...'x.sum(axis = 0)'。另外,'[1] * len(x [0])'可以在任何大小下工作。 – TemporalWolf
@TemporalWolf確實,謝謝你的幫助。 – tarashypka
我喜歡你的版本比我所做的更好,如果有必要在字典中提供元組。 'np.diag()'是完美的用途。 – TemporalWolf
給您的數據格式的最快方法的另一個有趣的解決方案是:
x.sum(axis=0)
這給出:
array([2, 0, 1])
當第一個結果是陣列的數量,其中第一個是熱的:
[1, 0, 0] [2
[0, 1, 0] 0
[0, 0, 1] 1]
這利用了以下事實只能有一個對的時間,所以我們可以分解直和。
sums = x.sum(axis=0)
{tuple(int(k == i) for k in range(len(sums))): e for i, e in enumerate(sums)}
,或者類似tarashypka:
如果你絕對需要它擴大到相同的格式,也可以通過轉換
{tuple(row): count for row, count in zip(np.eye(len(sums), dtype=np.int64), sums)}
產量:
{(1, 0, 0): 2, (0, 1, 0): 0, (0, 0, 1): 1}
@EricDuminil該編輯有幫助嗎?如果沒有,我會加入更多的解釋...總和的指數也是熱點的指數。 – TemporalWolf
好吧,明白了。我不知道「一個熱門」是什麼意思。尼斯。 –
@EricDuminil我假設OP正在談論熱線,但我真的不知道。 – TemporalWolf
什麼你有沒有嘗試過? [so]通常會在沒有顯示出解決自己問題的企圖的問題上皺眉。 – TemporalWolf
列表不可用,您不能將其用作字典中的鍵。 – tarashypka