在列表列表中反转浮点数

2024-05-16 18:29:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Markov转换表的输出,它是一个59个列表的列表,每个列表有59个浮动。我想反转每个非0浮点数,然后使输出正常化,这样我又有一个概率列表,加起来等于1。在

我读过关于清单理解的教科书,这似乎很有意义,但我一辈子都不明白如何实施它。在

列表列表是m

for i in range(59):
    [1/item for item in m[i] if item > 0.]
    i += 1

这会运行,但不会改变m。我在这段代码中使用item是不是错了?我应该用别的参考资料吗?在


Tags: 代码in列表forifrange概率item
3条回答

[1/item for item in m[i] if item > 0.]单独在一行上创建一个一次性对象。不是很有用。在

我的建议是:用双重理解重新构建你的列表:

m = [[1./item for item in sm if item > 0.] for sm in m]

这个解决方案在浮点除法方面是python2/3兼容的,不管列表包含什么(整数或浮点)

编辑:引用这个问题:“我想反转每个非0浮点”,这个公式是不正确的,因为它没有包含零。所以一个更精确的版本不是过滤,而是用三元来测试表达式,这样它就可以保持零。在

^{pr2}$

if item是针对0测试项的快捷方式)

您需要将其分配回循环中的m[i]

for i in range(len(m)):
    m[i] = [1./item if item != 0. else item for item in m[i]]

而且i+=1不需要,因为for循环为您完成了这项工作。在

为了避免子列表比原始子列表短,您需要将if从列表理解的末尾(基本上过滤哪些项被处理)移到前面(因此值本身是一个ternary expression,根据1/item或{})的值计算得出1/item或{})。在

此时,您可能应该观看演示文稿Loop like a Native,并将其重写为:

^{pr2}$

[1/item for item in m[i] if item > 0.]创建一个新列表。那你就什么都不做了。graphifer告诉您的是,您需要对新创建的列表的引用:
m[i] = <your list comprehension>将分配回列表的i行。在

另外,考虑numpy进行元素操作。演示:

>>> import numpy as np
>>> m = np.array([[1,2], [3, 0]])
>>> m = 1.0/m
>>> m
array([[ 1.        ,  0.5       ],
       [ 0.33333333,         inf]])
>>> m[m == np.inf] = 0
>>> m
array([[ 1.        ,  0.5       ],
       [ 0.33333333,  0.        ]])

相关问题 更多 >