我正在处理一个子程序,在这个子程序中,我需要处理矩阵的每一行,并找出当前行中包含的其他行。当一行包含另一行时,考虑3x3矩阵,如下所示:
[[1, 0, 1],
[0, 1, 0],
[1, 0, 0]]
这里第1行包含第3行,因为第1行中的每个元素都大于或等于第3行,但第1行不包含第2行。你知道吗
我提出了以下解决方案,但由于for循环(矩阵大小约为6000x6000),所以速度非常慢。你知道吗
for i in range(no_of_rows):
# Here Adj is the 2D matrix
contains = np.argwhere(np.all(Adj[i] >= Adj, axis = 1))
你能告诉我是否可以更有效地做这件事吗?你知道吗
由于矩阵的大小和问题的要求,我认为迭代是不可避免的。你不能利用广播,因为它会爆炸你的内存,所以你需要对现有的数组逐行操作。但是,您可以使用
numba
和njit
来大大加快速度,而不是使用纯python方法。你知道吗这会记录一行是否在另一行中使用。这可以在最后用
0
清除其他行中包含的行之前,通过短路防止许多不必要的比较。你知道吗与使用迭代的初始尝试相比,这是一种速度改进,而且还可以处理将正确的行归零的问题。你知道吗
我将更新计时一旦你的尝试完成运行(目前约10分钟)。你知道吗
如果你有矩阵6000x6000比你需要的(6000*6000-6000)/2=17997000计算。你知道吗
而不是使用np.triu指数,您可以尝试使用一个生成器来生成矩阵的上三角-这样可以减少内存消耗。试试这个,也许会有帮助。。你知道吗
相关问题 更多 >
编程相关推荐