!!!对于以下所有内容,使用的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
型
如果有人知道可能发生的事情,那将是一个很大的帮助!
1条答案
按热度按时间tvmytwxo1#
虽然我仍然不太明白为什么会发生这种情况,但我发现我的python版本似乎是罪魁祸首。我从3.10版本切换到3.8版本,现在一切都像预期的那样工作!