numpy在特定函数或数组掩码赋值时冻结

slsn1g29  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(178)

!!!对于以下所有内容,使用的numpy版本是1.21.0
我目前正在处理一些与基因信息有关的开源代码,当我第一次尝试运行它时,它在第一步中什么都不做,经过一些调查,我发现问题来自以下代码(在我的情况下,allele_matrix是一个numpy数组的形状(1024,1,2),dtype为np.int8)

dot_mask = allele_matrix == -1
    
if np.any(dot_mask):
    missing_rep_val = np.max(allele_matrix) + 1
    allele_matrix[dot_mask] = missing_rep_val # This line runs forever
else:
    missing_rep_val = None

字符串
由于这个项目的编译有点奇怪,我认为这与它有关,并决定提取数组allele_matrix(使用np.save)并在一个非常简单的Python脚本中尝试完全相同的操作,但出现了同样的问题:

import numpy as np
a = np.load("allele_mat.debug.npy")
a[a == -1] = 2 # Same problem here


然后我认为这可能与数组中的奇怪值有关,但当我尝试使用np.unique查找数组中的值时,代码也冻结了。

np.unique(a) # Also runs forever


我能够使用循环和迭代数组手动完成上述操作:它工作。通过使用此操作,我发现此数组中的值仅限于{-1,0,1}

# This works as expected and gives {-1,0,1}
import numpy as np
a = np.load("allele_mat.debug.npy")
vals = set()
for i in range(1024):
    for j in range(1):
        for k in range(2):
            vals.add(a[i][j][k])
print(vals)


这不是一个性能问题,因为只有2048个元素,它应该是非常即时的。(例如[[[-1,0]], [[0,1]]],甚至将dtype设置为np.int8),掩码分配工作正常。此外,对于任何这些执行,内存使用量保持在50 MB以下,我的机器有16 GB的内存
这种冻结问题出现在代码中的多个地方,因此将它们全部切换到循环替代方案实际上并不可行。
您可以通过运行以下命令下载我用于所有测试的文件(第一次使用此托管服务时,我不知道链接将有效多久)

curl -X GET https://basedbin.fly.dev/LGZ0FI.debug --output mat.npy


如果有人知道可能发生的事情,那将是一个很大的帮助!

tvmytwxo

tvmytwxo1#

虽然我仍然不太明白为什么会发生这种情况,但我发现我的python版本似乎是罪魁祸首。我从3.10版本切换到3.8版本,现在一切都像预期的那样工作!

相关问题