1
我一直在尋找一種方法來創建一個最終對稱的自定義h5py數組。理想情況下,它會是一個數組,當它創建時有一個指向a[i][j]
和a[j][i]
的單個值。原因是我將寫入一個大距離矢量到正方形矩陣。矢量和方形矩陣太大而不能保存在內存中,所以我想要一個相對快速的解決方案來創建矩形矩陣。使用指針h5py對稱陣列
我一直在尋找一種方法來創建一個最終對稱的自定義h5py數組。理想情況下,它會是一個數組,當它創建時有一個指向a[i][j]
和a[j][i]
的單個值。原因是我將寫入一個大距離矢量到正方形矩陣。矢量和方形矩陣太大而不能保存在內存中,所以我想要一個相對快速的解決方案來創建矩形矩陣。使用指針h5py對稱陣列
我會建議做一點額外的邏輯使用一維數組來存儲矩陣的上三角形。地圖一維數組中的索引< - 像這樣的映射>二維數組:
[[0 1 2 3 ]
[x 4 5 6 ]
[x x 7 8 ]
[x x x 9 ]]
您可以編寫一個函數此爲:
from __future__ import division
def tri_ravel_factory(n_cols):
def tri_ravel(j, k):
assert j < n_cols, 'j out of range'
assert k < n_cols, 'j out of range'
assert j >= 0, 'j out of range'
assert k >= 0, 'j out of range'
if k < j:
j, k = k, j
#return sum(n_cols - tmp for tmp in range(0, j)) + (k - j)
return j * n_cols - (j * (j-1))//2 + (k-j)
return tri_ravel
test_ravel = tri_ravel_factory(4)
indx = test_ravel(1, 0)
這隻會讓你的兩個因素。用稀疏陣列計算你需要的距離,或者找到一種不必計算大部分距離的方法(比如你只關心與distance < r
配對)。
這就是我最初的計劃,但最終我希望能夠沿着每一行進行排序。雙方都會更容易,然後有額外的邏輯來提取下三角形的值,以便對特定行進行排序。 – biophetik
@biophetik你放棄了試圖完全這樣做嗎?你可以用數據將這個邏輯放到一個類中,然後公開一個界面,讓你可以很容易地進行排序。 – tacaswell
是的,我其實只是切換方法來徹底消除這個問題。但它仍然令我感興趣。我記得看到一篇文章,他們從h5py數組中創建了一個新類,其中包含數組的鏡像。基本上他們指出了矩陣的上半部分和相應的下半部分的值。我從來沒有再發現這篇文章....也許這是一個夢想。 – biophetik