调整矩阵大小摆脱0条目 - Python

时间:2015-11-24 15:51:42

标签: python arrays numpy matrix sparse-matrix

我有我的矩阵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 个答案:

答案 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