调整矩阵大小删除 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
我有我的矩阵 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