我一直在寻找一种方法来创建最终对称的自定义 h5py 数组。理想情况下,它是一个数组,在创建时具有 a[i][j]
和 a[j][i]
指向的单个值。这样做的原因是我将把一个大的距离向量写入一个方形矩阵中。向量和方阵太大,无法保存在内存中,因此我想要一个相对快速的解决方案来创建方阵。
最佳答案
我建议使用一些额外的逻辑来做到这一点,使用一维数组来存储矩阵的上三角形。使用如下映射映射一维数组 <-> 二维数组中的索引:
[[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
配对)。
关于python - h5py 使用指针的对称数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13620719/