在我的作業中,我經常需要聚合和擴展各種數量的矩陣,并且我正在尋找最有效的方法來執行這些操作。例如,我將有一個NxN我想從 where 聚合NxN的PxP矩陣P < N。這是使用較大尺寸和較小尺寸之間的對應關系來完成的。通常,P會在100左右。
例如,我將有一個4x4這樣的假設矩陣(盡管在實踐中,我的矩陣會大得多,大約1000x1000)
m=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
>>> m
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
和這樣的信件:
0,0
1,1
2,0
3,1
我通常存盤在字典中。這意味著索引 0 和 2 都分配給新索引 0,索引 1 和 3 都分配給新索引 1。矩陣可以是任何東西,但當我想壓縮時,對應關系總是多對一的.
這里的聚合程序將導致:
array([[ 24, 28 ],
[ 40, 44 ]])
我可以通過制作一個大小合適的空矩陣并回圈初始矩陣的所有 4x4=16 單元格并在嵌套回圈中累積來做到這一點,但這似乎效率低下,并且人們總是強調 numpy 的向量化性質。我也通過使用np.ix_來制作索引集和使用來完成它m[row_indices, col_indices].sum(),但我想知道最有效的類似 numpy 的方法是什么。
相反,用另一種方式使用對應來擴展矩陣的明智和有效的方法是什么?例如,具有相同的對應關系,但相反,我將從:
array([[ 1, 2 ],
[ 3, 4 ]])
至
array([[ 1, 2, 1, 2 ],
[ 3, 4, 3, 4 ],
[ 1, 2, 1, 2 ],
[ 3, 4, 3, 4 ]])
其中值只是被復制到新單元格中。
到目前為止,在我對聚合的嘗試中,我使用了帶有groupby索引和列的 pandas 方法的方法,然后使用例如df.values. 但是,我不知道擴展矩陣的等效方法,而不使用諸如此類的很多unstack東西join。而且我看到人們經常說使用 pandas 不省時。
編輯 1:我在評論中被問到應該如何進行聚合。如果我在原始維度和新維度之間使用嵌套回圈和字典查找,這就是它的完成方式:
>>> m=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
>>> mnew=np.zeros((2,2))
>>> big2small={0:0, 1:1, 2:0, 3:1}
>>> for i in range(4):
... inew = big2small[i]
... for j in range(4):
... jnew = big2small[j]
... mnew[inew, jnew] = m[i, j]
...
>>> mnew
array([[24., 28.],
[40., 44.]])
uj5u.com熱心網友回復:
假設您的索引沒有常規結構,我會嘗試稀疏矩陣。
import scipy.sparse as ss
import numpy as np
# your current array of indices
g=np.array([[0,0],[1,1],[2,0],[3,1]])
# a sparse matrix of (data=ones, (row_ind=g[:,0], col_ind=g[:,1]))
# it is one for every pair (g[i,0], g[i,1]), zero elsewhere
u=ss.csr_matrix((np.ones(len(g)), (g[:,0], g[:,1])))
總計的
m=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
u.T @ m @ u
擴張
m2 = np.array([[1,2],[3,4]])
u @ m2 @ u.T
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505109.html
