我正在寻找一种可靠的方法,将使用
我希望计算这个矩阵的海明距离。对于小矩阵,可以使用SciPy中的
然而,在矩阵较大的情况下,这会在Python中引发MemoryError。
我知道可以使用“pdist”命令计算这些情况下的汉明距离。它返回一个1D数组中上三角的距离。
我的问题与我不知道如何在每一行上从结果重构矩阵有关。 我知道函数,但对于大型矩阵,它会引发MemoryErrors的问题。
scipy.spatial.distance.pdist
函数生成的压缩汉明距离数组转换为相应的2D汉明距离矩阵。我知道scipy.spatial.distance.squareform
函数,但是我需要计算高达100,000 x 100,000矩阵的汉明距离,这在Python中会导致MemoryError
。
我需要以逐行的方式将压缩矩阵转换成方阵形式。是否有人知道使用NumPy和/或相关软件包的可靠(可能快速)实现呢?
我需要对每行执行numpy.sum
计算,但无法在内存中存储完整的N x N矩阵。
目前,我正在使用嵌套循环遍历输入矩阵并手动计算距离。identity = 0.7
hamming_sum = numpy.zeros(msa_mat.shape[0], dtype=numpy.float64)
hamming_dist = numpy.zeros(msa_mat.shape[0], dtype=numpy.float64)
for i, row1 in enumerate(msa_mat):
hamming_dist.fill(0)
for j, row2 in enumerate(msa_mat):
if i != j:
hamming_dist[j] = scipy.spatial.distance.hamming(row1, row2)
hamming_sum[i] = numpy.sum(numpy.where(hamming_dist < (1 - identity), 1, 0), axis=0)
编辑1
我的数据看起来像以下矩阵:
>>> a = numpy.array([1, 2, 3, 4, 5, 4, 5, 4, 2, 7, 9, 4, 1, 5, 6, 2, 3, 6], dtype=float).reshape(3, 6)
>>> a
array([[ 1., 2., 3., 4., 5., 4.],
[ 5., 4., 2., 7., 9., 4.],
[ 1., 5., 6., 2., 3., 6.]])
我希望计算这个矩阵的海明距离。对于小矩阵,可以使用SciPy中的
cdist
命令轻松完成,并返回如下结果:>>> cdist(a, a, 'hamming')
array([[ 0. , 0.83333333, 0.83333333],
[ 0.83333333, 0. , 1. ],
[ 0.83333333, 1. , 0. ]])
然而,在矩阵较大的情况下,这会在Python中引发MemoryError。
我知道可以使用“pdist”命令计算这些情况下的汉明距离。它返回一个1D数组中上三角的距离。
>>> pdist(a, 'hamming')
array([ 0.83333333, 0.83333333, 1. ])
我的问题与我不知道如何在每一行上从结果重构矩阵有关。 我知道函数,但对于大型矩阵,它会引发MemoryErrors的问题。
pdist
和cdist
的输入是点数组。也就是说,如果输入是形状为(m, n)
的数组,则表示n
维空间中的m
个点。在您的示例中,a
的形状为(4, 4)
:它表示4维空间中的4个点。所以我想知道为什么a
恰好是对称的。这只是您选择的示例的偶然吗? - Warren Weckesserhamming_sum[i] = numpy.sum(numpy.where(hamming_dist < (1 - identity), 1, 0), axis=0)
,看起来你的最终目标是:对于每个点,计算在该点半径为1-identity
内有多少其他点,使用汉明距离计算点之间的距离。正确吗? - Warren Weckesser