2012-11-29 58 views
1

我一直在尋找一種方法來創建一個最終對稱的自定義h5py數組。理想情況下,它會是一個數組,當它創建時有一個指向a[i][j]a[j][i]的單個值。原因是我將寫入一個大距離矢量到正方形矩陣。矢量和方形矩陣太大而不能保存在內存中,所以我想要一個相對快速的解決方案來創建矩形矩陣。使用指針h5py對稱陣列

回答

1

我會建議做一點額外的邏輯使用一維數組來存儲矩陣的上三角形。地圖一維數組中的索引< - 像這樣的映射>二維數組:

[[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配對)。

+0

這就是我最初的計劃,但最終我希望能夠沿着每一行進行排序。雙方都會更容易,然後有額外的邏輯來提取下三角形的值,以便對特定行進行排序。 – biophetik

+0

@biophetik你放棄了試圖完全這樣做嗎?你可以用數據將這個邏輯放到一個類中,然後公開一個界面,讓你可以很容易地進行排序。 – tacaswell

+0

是的,我其實只是切換方法來徹底消除這個問題。但它仍然令我感興趣。我記得看到一篇文章,他們從h5py數組中創建了一個新類,其中包含數組的鏡像。基本上他們指出了矩陣的上半部分和相應的下半部分的值。我從來沒有再發現這篇文章....也許這是一個夢想。 – biophetik