调整矩阵大小删除 0 个条目 - Python

Resizing matrix getting rid of 0 entries - Python

我有我的矩阵 E,我一直在以某种方式填充它(如何填充并不重要,重要的是所有条目都不为 0)。矩阵的维度是 n_x*n_y X n_x*n_y,其中

n_x = 4
n_y = 8

现在我将一些条目设置为 0:

step = 4.
for i in range(n_x):
    for j in range(n_y):
        if ((i or j)%step != 0):
            e[i][j] = 0.

然后我想去掉等于 0 的条目,调整矩阵​​的大小。我这样做的方式是:

filter(lambda a: a != 0., E)

但我得到的是

filter(lambda a: a != 0., E)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有人可以向我解释发生了什么以及如何解决吗?

编辑:

我意识到我在我的代码中犯了一个错误,在我将矩阵的某些条目设置为 0 的部分。我将在下面更正此问题:

step = 4.
    for i in range(n_x):
        for j in range(n_y):
            if ((i%step != 0) or (j%step !=0)):
                e[i][j] = 0.

我已经对您的代码进行了一些调整并完成了一些,它运行良好(见下文)。

我相信您遇到的问题是您正在迭代列表(1 维),而不是迭代列表中的项目(2 维/矩阵)。

您需要 map 您的 filter 遍历构成矩阵的列表。

n_x = 4
n_y = 8
step = 4.

e = [['x' for _ in range(n_y)] for _ in range(n_x)]

# e:
# [['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'],
#  ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'],
#  ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'],
#  ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']]



for i in range(n_x):
    for j in range(n_y):
        if ((i or j)%step != 0):
            e[i][j] = 0.

# e: 
# [['x', 0.0, 0.0, 0.0, 'x', 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, 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, 0.0]]


# map + filter
no_zeroes = list(map(lambda x: list(filter(lambda a: a != 0., x)), e))

# no_zeroes:
# [['x', 'x'], [], [], []]

如果列表理解更清楚,这等价于:

# list comprehensions (equivalent)
no_zeroes_lc = [[col for col in row if col != 0.] for row in e]

# no_zeroes_lc:
# [['x', 'x'], [], [], []]

no_zeroes == no_zeroes_lc  # True