gpt4 book ai didi

python - 使用 numpy 有效测试矩阵行和列

转载 作者:行者123 更新时间:2023-12-01 02:31:28 24 4
gpt4 key购买 nike

当第 i 行列 i 都包含全 0 时,我尝试删除第 i 行和第 i 列。例如,在本例中,我们可以看到第 0 行全为零,第 0 列全零,因此行和列 0 被删除。与行列对 2 和 4 相同。行 1 全部为零,但列 1 不是,因此两者都不会被删除。

[0,0,0,0,0]
[0,1,0,1,0]
[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]

会变成

[1,1]
[0,0]

另一个例子:

[0,0,1,0,0,1]
[0,0,0,0,0,0]
[0,0,0,0,0,0]
[0,0,0,0,0,0]
[0,0,0,0,0,0]
[0,0,1,0,1,0]

将更改为:

[0,1,0,1]
[0,0,0,0]
[0,0,0,0]
[0,1,1,0]

这是我用来计算的代码:

def remove(matrix):
for i, x in reversed(list(enumerate(matrix))):
if np.all(matrix == 0, axis=0)[i] and np.all(matrix == 0, axis=1)[i]:
matrix = np.delete(matrix,i,axis=0)
matrix = np.delete(matrix,i,axis=1)
return matrix

经过测试,这条线到目前为止花费的时间最多:

if np.all(matrix == 0, axis=0)[i] and np.all(matrix == 0, axis=1)[i]:

是否有更合适的方法来以这种方式测试行和列?我使用的矩阵是稀疏二进制矩阵。我没有使用任何稀疏矩阵类,只是使用 ndarray。

最佳答案

带有掩蔽的矢量化方法 -

def remove_vectorized(a):
mask = a==0
m_row = ~mask.all(1)
m_col = ~mask.all(0)
comb_mask = m_row | m_col
return a[comb_mask][:,comb_mask] #or a[np.ix_(comb_mask, comb_mask)]

示例运行

案例#1:

In [485]: a
Out[485]:
array([[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

In [486]: remove_vectorized(a)
Out[486]:
array([[1, 1],
[0, 0]])

案例#2:

In [489]: a
Out[489]:
array([[0, 0, 1, 0, 0, 1],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 1, 0]])

In [490]: remove_vectorized(a)
Out[490]:
array([[0, 1, 0, 1],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 1, 1, 0]])

关于python - 使用 numpy 有效测试矩阵行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774681/

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