【发布时间】:2019-10-04 02:21:54
【问题描述】:
我有两个大矩阵 (40000*4096),我想将第一个矩阵的每一行与第二个矩阵的所有行进行比较和匹配,因此,输出的大小为 (40000* 40000)。但是,由于我需要这样做数千次,因此每次迭代需要花费 26k 秒的时间,所以 5000 次...... 如果你能给我一些聪明的建议,我会很高兴。谢谢你。 附言到目前为止,我只做了一次迭代(5000 次中的 1 次)
def matcher(Antigens, Antibodies,ind):
temp = np.zeros((Antibodies.shape[0],Antibodies.shape[1]))
output = np.zeros((Antibodies.shape[0],1))
for i in range(len(Antibodies)):
temp[i] = np.int32(np.equal(Antigens[ind],Antibodies[i]))
output[i] = np.sum(temp[i])
return output
output = [matcher(gens,Antibodies) for gens in Antigens]
【问题讨论】:
-
您可能想尝试使用更适合数值计算的语言来执行此操作,例如 Julia/Fortran/C++。如果不是,这是并行化的绝佳候选者。
-
谢谢,你是说多处理还是多线程还是别的什么?
-
否则,您可以进行一些细微的优化。将
temp和output初始化为空数组,而不是零。删除类型转换np.int32并在temp初始化时设置dtype=np.int32。 -
我的意思是
multiprocessing。 PETSc 将是一个不错的候选者,但当前的 Python 绑定看起来很弱。 -
如果我说得对,请告诉我:您必须进行 5000 次抗原和抗体矩阵比较(每个都是 40000 x 4096)。您正在将抗原矩阵中的每一行/阵列与抗体矩阵中的所有行/阵列进行比较。如果行的所有元素都匹配(或者您正在对匹配数求和?),则此比较返回 1。每对的结果是一个 40000 x 40000 的 1 和 0 矩阵,表示抗原和抗体之间的匹配行(或求和情况下 0-4096 之间的数字)。最后,你会有 5000 个这样的匹配矩阵?
标签: python algorithm numpy matrix