假設A
具有存儲爲2D numpy array
的數據,你可以做這樣的事情 -
unqA = np.unique(A[:,0])
out = {unqA[i]:A[A[:,0]==unqA[i],1:] for i in range(len(unqA))}
採樣運行 -
In [109]: A
Out[109]:
array([[1, 0, 0, 3, 4, 5],
[3, 0, 0, 9, 0, 0],
[5, 0, 0, 2, 2, 2],
[1, 0, 1, 5, 0, 0],
[5, 0, 1, 3, 0, 0],
[5, 1, 0, 0, 4, 0]])
In [110]: unqA = np.unique(A[:,0])
In [111]: {unqA[i]:A[A[:,0]==unqA[i],1:] for i in range(len(unqA))}
Out[111]:
{1: array([[0, 0, 3, 4, 5],
[0, 1, 5, 0, 0]]),
3: array([[0, 0, 9, 0, 0]]),
5: array([[0, 0, 2, 2, 2],
[0, 1, 3, 0, 0],
[1, 0, 0, 4, 0]])}
如果你好嗎這樣的矩陣作爲輸出的一個列表,你可以避開循環像這樣 -
sortedA = A[A[:,0].argsort()]
_,idx = np.unique(sortedA[:,0],return_index=True)
out = np.split(sortedA[:,1:],idx[1:],axis=0)
採樣運行 -
In [143]: A
Out[143]:
array([[1, 0, 0, 3, 4, 5],
[3, 0, 0, 9, 0, 0],
[5, 0, 0, 2, 2, 2],
[1, 0, 1, 5, 0, 0],
[5, 0, 1, 3, 0, 0],
[5, 1, 0, 0, 4, 0]])
In [144]: sortedA = A[A[:,0].argsort()]
In [145]: _,idx = np.unique(sortedA[:,0],return_index=True)
In [146]: np.split(sortedA[:,1:],idx[1:],axis=0)
Out[146]:
[array([[0, 0, 3, 4, 5],
[0, 1, 5, 0, 0]]), array([[0, 0, 9, 0, 0]]), array([[0, 0, 2, 2, 2],
[0, 1, 3, 0, 0],
[1, 0, 0, 4, 0]])]
現在,如果你還是希望有一個dict-based
輸出,你可以使用輸出上面,像這樣 -
out_dict = {sortedA[:,0][idx[i]]:out[i] for i in range(len(idx))}
給我們 -
In [153]: out
Out[153]:
[array([[0, 0, 3, 4, 5],
[0, 1, 5, 0, 0]]), array([[0, 0, 9, 0, 0]]), array([[0, 0, 2, 2, 2],
[0, 1, 3, 0, 0],
[1, 0, 0, 4, 0]])]
In [154]: {sortedA[:,0][idx[i]]:out[i] for i in range(len(idx))}
Out[154]:
{1: array([[0, 0, 3, 4, 5],
[0, 1, 5, 0, 0]]),
3: array([[0, 0, 9, 0, 0]]),
5: array([[0, 0, 2, 2, 2],
[0, 1, 3, 0, 0],
[1, 0, 0, 4, 0]])}
在你的榜樣,有CSV塊的6列。 「根據第一列分割數據」意味着什麼。 6個csv塊中的第一個或每個csv塊的第一個項目?另外,如果您的字典密鑰有重複,該怎麼辦? – vincent
@vincent編輯了這個問題。因爲它們是類標籤,所以在第一列中會有重複項,所以它們應該添加到矩陣中。 –
你願意與這樣的矩陣列表嗎? – Divakar