Python 如何获取列表中所有元素的日志

Python 如何获取列表中所有元素的日志,python,arrays,Python,Arrays,我有一个数组 x = [1500, 1049.8, 34, 351, etc] 如何获取整个阵列的log_10() from math import log [log(y,10) for y in x] import numpy numpy.log10(mat) 注意 mat不必是numpy数组,而且numpy应该比其他答案所建议的使用列表理解更快 import math x = [1500, 1049.8, 34, 351] y = [math.log10(num) for num in

我有一个数组

x = [1500, 1049.8, 34, 351, etc]
如何获取整个阵列的log_10()

from math import log
[log(y,10) for y in x]
import numpy
numpy.log10(mat)
注意

mat
不必是numpy数组,而且
numpy
应该比其他答案所建议的使用列表理解更快

import math
x = [1500, 1049.8, 34, 351]
y = [math.log10(num) for num in x]

这被称为一个。它所做的是创建一个新列表,其元素是应用于原始
列表中相应元素的结果,顺便说一句,该列表不是一个。最简单的方法是使用


示例:

>>> x = [1500, 1049.8, 34, 351]
>>> import math
>>> [math.log10(i) for i in x]
[3.1760912590556813, 3.021106568432122, 1.5314789170422551, 2.545307116465824]
>>> 
>>> map(math.log10, x)
[3.1760912590556813, 3.021106568432122, 1.5314789170422551, 2.545307116465824]
>>> 
另一种方法是使用函数


示例:

>>> x = [1500, 1049.8, 34, 351]
>>> import math
>>> [math.log10(i) for i in x]
[3.1760912590556813, 3.021106568432122, 1.5314789170422551, 2.545307116465824]
>>> 
>>> map(math.log10, x)
[3.1760912590556813, 3.021106568432122, 1.5314789170422551, 2.545307116465824]
>>> 

您还可以使用
map
内置功能:

import math
new_list = map(math.log10, old_list)
这可能比列表理解速度要快得多。我在这里添加它主要是为了显示两者之间的相似性

编辑(回应@HankGay的评论)

为了证明map在这种情况下稍微快一点,我编写了一个小的基准测试:

import timeit

for i in range(10):
    t=timeit.timeit("map(math.log10,a)",setup="import math; a=range(1,100)")
    print "map",t
    t=timeit.timeit("[math.log10(x) for x in a]",setup="import math; a=range(1,100)")
    print "list-comp",t
以下是我的笔记本电脑(OS-X 10.5.8,CPython 2.6)上的结果:


但重要的是要认识到速度不是一切。“可读性很重要”。如果
map
创建了更难阅读的内容,一定要进行列表理解。

或使用
log10
;)
这通常比log(x,10)更精确。
这可以回答海报上的问题,而且效率很高,但我试着取二维数组的对数。为此,我改用了
numpy.log10
。如果
map
比列表comp快,至少在CPython上,我会感到非常震惊。列表comps的CPython实现在wazoo中进行了优化。如果我有一些停机时间,我可能会去建立一个微基准,正如我们都知道的,它非常有用:-)@HankGay——看看我的更新。对于这个简单的测试用例,
map
比同等的列表comp快近50%。@mgilson。我在我的工作机器上,所以它是Snow Leopard w/
Python2.6.1(r261:67515,Jun 24 2010,21:47:49)
,我的数字基本上显示列表比较快,但差异太小了,我怀疑它在统计上是否显著:产生了
lc:1.03603506088,映射:1.04137277603
lc:1.16478681564,map:1.21709990501
,和
lc:0.909293889999,map:1.15685892105
@HankGay——我重新进行了我的测试,给了列表comp一点“优势”(
来自math import log10
)和
[log10(x)代表a中的x]
,map仍然获胜,但差距要小得多(map~23s,list~u comp~25s)。我想知道我们的时间安排是否与64位对32位有关(我偶尔也看到过这种情况)。我也可以在UbuntuLinux上试用我的基准测试——我会试一试,然后再给你回复……也许这个链接()可以作为这个主题的最终参考……我毫不怀疑NumPy会做到这一点,而且会很快做到,但是请记住,为一些简单的脚本安装NumPy有点过分。谁说是为了一些简单的脚本?@mutzmatron没有人,我想,但这个问题有一种初学者的感觉,当我刚开始的时候,我用小问题,小问题来减少我在任何时候都可能搞砸的事情的数量。我只是想指出这一点。FTR,我比你高,因为你给出了一个很好的答案,这和我们20个人的答案不一样,他们都加入了一个列表comp作为我们的答案。@HankGay-hehehe是的,我注意到列表comp的答案是如何涌入的。为升级投票干杯,我确实同意,从某种意义上讲,python的方法是使用list comp,我经常使用它们。使用
numpy.log10
对我的二维数组有效,而
math.log10
则不行。