gpt4 book ai didi

python - 如何有效比较二维矩阵中的每一对行?

转载 作者:行者123 更新时间:2023-12-01 07:56:35 25 4
gpt4 key购买 nike

我正在开发一个子例程,我需要处理矩阵的每一行并查找当前行中包含哪些其他行。为了说明当一行包含另一行时,请考虑一个 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))

您能否告诉我是否可以更有效地做到这一点?

最佳答案

由于矩阵的大小以及问题的要求,我认为迭代是不可避免的。您不能使用广播,因为它会消耗您的内存,因此您需要对现有数组进行逐行操作。不过,与纯 Python 方法相比,您可以使用 numbanjit 显着加快速度。

<小时/>
import numpy as np
from numba import njit


@njit
def zero_out_contained_rows(a):
"""
Finds rows where all of the elements are
equal or smaller than all corresponding
elements of anothe row, and sets all
values in the row to zero

Parameters
----------
a: ndarray
The array to modify

Returns
-------
The modified array

Examples
--------
>>> zero_out_contained_rows(np.array([[1, 0, 1], [0, 1, 0], [1, 0, 0]]))
array([[1, 0, 1],
[0, 1, 0],
[0, 0, 0]])
"""
x, y = a.shape

contained = np.zeros(x, dtype=np.bool_)

for i in range(x):
for j in range(x):
if i != j and not contained[j]:
equal = True
for k in range(y):
if a[i, k] < a[j, k]:
equal = False
break
contained[j] = equal

a[contained] = 0

return a

这会记录一行是否在另一行中使用。这可以防止在最终用 0 删除其他行中包含的行之前通过短路进行许多不必要的比较。

<小时/>

与您最初使用迭代的尝试相比,这是速度的改进,并且还可以处理正确行的清零。

<小时/>
a = np.random.randint(0, 2, (6000, 6000))

%timeit zero_out_contained_rows(a)
1.19 s ± 1.87 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

一旦您的尝试完成运行(目前约为 10 分钟),我将更新计时。

关于python - 如何有效比较二维矩阵中的每一对行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55941569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com