首页 > 解决方案 > 如何减少 2D numpy 代码中的 if 语句数量?

问题描述

例如,我有一个 numpy ndarray ( M),其中包含一个包含 N x N 个数字(N 是整数)的 2D 对称矩阵

[[1. 2. 0. 0. 2. 2. 2.]
 [2. 1. 2. 0. 0. 2. 2.]
 [0. 2. 1. 2. 0. 0. 2.]
 [0. 0. 2. 1. 2. 0. 0.]
 [2. 0. 0. 2. 1. 2. 0.]
 [2. 2. 0. 0. 2. 1. 2.]
 [2. 2. 2. 0. 0. 2. 1.]]

我想检查一下:将 M 中的 i,j 项设置为 0,其中 i+1、i+2、i+3 中的 j 在 M 中设置为零

我有这个代码,这样做:

for i in range(len(M)):
     for j in range(len(M)):
        if M[i, j] != 0:
            if j == len(M) - 3:
                M[i, j+2] = 0
                M[i, j+1] = 0
            elif j == len(M) - 2:
                M[i, j+1] = 0
            elif j == len(M) - 1:
                   continue
            else:
                M[i, j + 3] = 0
                M[i, j + 2] = 0
                M[i, j + 1] = 0
        else:
            continue

它工作得很好,但我想减少我的 if 语句。我读过M[i,j:j+3],但我真的不知道如何使用它。

我正在等待以下输出矩阵:

[[1. 0. 0. 0. 2. 0. 0.]
 [2. 0. 0. 0. 0. 2. 0.]
 [0. 2. 0. 0. 0. 0. 2.]
 [0. 0. 2. 0. 0. 0. 0.]
 [2. 0. 0. 0. 1. 0. 0.]
 [2. 0. 0. 0. 2. 0. 0.]
 [2. 0. 0. 0. 0. 2. 0.]]

标签: pythonnumpyif-statement

解决方案


这应该有效:

for i in range(len(M)):
     for j in range(len(M)):
        if M[i, j] != 0:
            M[i, (j+1):(j+4)] = 0
print (M)

输出:

[[1. 0. 0. 0. 2. 0. 0.]
 [2. 0. 0. 0. 0. 2. 0.]
 [0. 2. 0. 0. 0. 0. 2.]
 [0. 0. 2. 0. 0. 0. 0.]
 [2. 0. 0. 0. 1. 0. 0.]
 [2. 0. 0. 0. 2. 0. 0.]
 [2. 0. 0. 0. 0. 2. 0.]]

推荐阅读