使用指针的h5py对称数组

时间:2012-11-29 07:21:20

标签: python arrays symmetric h5py

我一直在寻找一种方法来创建一个最终对称的自定义h5py数组。理想情况下,它将是一个数组,以便在创建时具有a[i][j]a[j][i]指向的单个值。这样做的原因是我将大距离矢量写入方形矩阵。向量和方阵太大而无法保存在内存中,所以我想要一个相对快速的解决方案来创建方阵。

1 个答案:

答案 0 :(得分:1)

我建议用一些额外的逻辑来做这个,使用一维数组来存储矩阵的上三角形。在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)    

这只会让你两倍。使用稀疏数组可能会更好,计算动态所需的距离,或找到一种不必计算大部分距离的方法(例如,如果您只关心与distance < r配对)。