【问题标题】:How to delete all occurrences of a value from a matrix?如何从矩阵中删除所有出现的值?
【发布时间】:2017-07-22 13:22:21
【问题描述】:

h成为我的矩阵

h=[[0,346,34,6,7,0,0,34634,6,0],[2352,205230,523,50,5023,502,350,0,0]]

我想删除h 中的所有零。

所以结果应该是:

h=[[346,34,6,7,34634,6],[2352,205230,523,50,5023,502,350]]

我从HERE 和其他问题尝试了几种不同的方法,但似乎对矩阵没有任何作用。有什么好的解决办法吗?

【问题讨论】:

  • 这是一个 numpy 矩阵吗?

标签: python matrix removeall


【解决方案1】:

如果您想就地更改矩阵,您可以使用如下函数来完成。诀窍是向后遍历每一行的元素,这样连续元素的索引就不会因为之前删除的索引而改变。

def remove_zeros(matrix):
    for row in matrix:
        length = len(row)-1
        for i, elem in enumerate(reversed(row)):
            if not elem:  # zero value?
                row.pop(length-i)

h = [[0, 346, 34, 6, 7, 0, 0, 34634, 6, 0], [2352, 205230, 523, 50, 5023, 502, 350, 0, 0]]

remove_zeros(h)

print(h)  # -> [[346, 34, 6, 7, 34634, 6], [2352, 205230, 523, 50, 5023, 502, 350]]

【讨论】:

  • 我会使用reversed(row) 而不是row[::-1]
  • @FelipeNardiBatista:当然,这也可以,而且更具可读性。然而大多数“Pythonistas”会立即认出[::=1],因为它是在reversed() 内置函数被添加到语言之前常用的。
  • 是的,但到目前为止,它更具可读性和效率,因为它不复制行,它只是迭代它
  • @FelipeNardiBatista:好的,好的...;-)
【解决方案2】:

您可以简单地使用列表推导:

h = [[element for element in <b>row</b> if element] <b>for row in h</b>]

所以在这里我们遍历h 中的每个row。对于每一行,我们构建一个新列表[element for element in row if element]。这意味着对于row 中的每个element,我们检查它是否等于0(带有if element)。如果不是,bool(element) 就是True,因此我们将element 添加到该列表中。否则我们省略element

【讨论】:

  • chain.from_iterable(h.tolist()) 代替 h 如果它是 numpy 矩阵。
  • @NickilMaveli:你为什么需要chain
  • 这是因为tolist() 创建了一个额外的外部list,您需要将其展平。
  • @NickilMaveli:我已经测试过了,你会得到一个我们想要的二维列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2016-10-19
  • 2010-11-12
相关资源
最近更新 更多