我有我的矩阵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.
答案 0 :(得分:1)
我已经适应并完成了你的代码,它运行正常(见下文)。
我相信您遇到的问题是您在列表(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