-2

我在 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]]

提前致谢!

4

2 回答 2

0

退房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 在评论中提到并在这个问题中讨论的那样,如果在 python 2 上工作,这将不会产生所需的输出。

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

Python2:

>>> round(0.5)
1.0

Python3

>>> round(0.5)
0
于 2018-04-28T19:47:07.263 回答
0

有几种方法可以做到这一点;通过列表理解在纯 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]]

矢量化替代方案

这使用 3rd 方库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 格式存储数字数据的性质,因此很难将浮点数与浮点数进行比较。请参阅浮点数学是否损坏?更多细节。即使使用上述方法,这也是一个问题。

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

于 2018-04-28T21:22:30.263 回答