1

私は、最終的に対称なカスタムh5py配列を作成する方法を探していました。理想的には、作成時に単一の値を持ち、それを指すような配列になりa[i][j]ますa[j][i]。これは、長距離ベクトルを正方形の行列に書き込むためです。ベクトルと正方行列は大きすぎてメモリに保持できないため、比較的高速なソリューションで正方行列を作成したいと思います。

4

1 に答える 1

1

これを行うには、少し余分なロジックを使用して、1D 配列を使用して行列の上三角形だけを格納することをお勧めします。次のようなマッピングを使用して、1D 配列 <-> 2D 配列のインデックスをマップします。

[[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)    

これは 2 倍しか得られません。スパース配列を使用して、必要な距離をその場で計算するか、ほとんどの距離を計算する必要がない方法を見つけた方がよい場合があります (とのペアのみを気にする場合などdistance < r)。

于 2013-05-27T15:15:57.280 に答える