【问题标题】:Python list vector matrix decimals 0s 1sPython列表向量矩阵小数0s 1s
【发布时间】:2018-04-28 18:59:11
【问题描述】:

我在 python 中有一个列表

l=[[0.1,0.2,0.9],[0.3,0.4,0.6],[0.8,0.2,0.8]]

如果element <=0.5,返回0, 如果element > 0.5,则返回1

因此得到的 l 应该如下所示:

l=[[0,0,1],[0,0,1],[1,0,1]]

提前致谢!

【问题讨论】:

  • 您的问题是什么?这不是代码编写服务。这是一个问答网站。
  • 为什么 0.5 被四舍五入?

标签: python python-3.x list matrix vector


【解决方案1】:

查看round

>>> l=[[0.1,0.2,0.9],[0.3,0.4,0.6],[0.8,0.2,0.8]]
>>> [[round(x) for x in i] for i in l]
[[0, 0, 1], [0, 0, 1], [1, 0, 1]]

正如@iAdjunct 在 cmets 中提到的,并在this 问题中讨论过,如果在 python 2 上工作,这将不会产生所需的输出。

那是因为它们采用了不同的舍入方法。可以通过以下示例来说明差异:

Python2:

>>> round(0.5)
1.0

Python3

>>> round(0.5)
0

【讨论】:

  • 注意:他的功能实际上与round不同,因为出于某种原因,他的舍入为0.5 down而不是up
  • 刚刚在 python3.6 中测试,round(0.5) 返回0
  • Python 2.7.10 返回1.0。这很奇怪; Python2 的round 函数与传统的round 定义一致,但Python3 实现了round-half-to-even 范式(en.wikipedia.org/wiki/Rounding#Round_half_to_even)。
【解决方案2】:

有几种方法可以做到这一点;通过列表理解在纯 Python 中或使用 3rd 方库以矢量化方式。

纯 Python

您可以使用嵌套列表推导。

l = [[0.1,0.2,0.9],[0.3,0.4,0.6],[0.8,0.2,0.8]]

res = [[0 if i <= 0.5 else 1 for i in row] for row in l]

[[0, 0, 1], [0, 0, 1], [1, 0, 1]]

矢量化替代

这使用了第三方库numpy

import numpy as np

res = np.where(np.array(l) <= 0.5, 0, 1)

array([[0, 0, 1],
       [0, 0, 1],
       [1, 0, 1]])

四舍五入说明

由于float 的性质以base-10 格式存储数字数据,因此很难将浮点数与浮点数进行比较。有关详细信息,请参阅Is floating point math broken?。即使使用上述方法也是一个问题。

这意味着如果这对您很重要,您可能需要特别注意边界情况。

【讨论】:

    猜你喜欢
    • 2015-07-23
    • 2014-07-06
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多