2012-07-25 40 views
13

的所有元素的日志我有一个数组如何采取列表

x = [1500, 1049.8, 34, 351, etc] 

我怎样才能把整个阵列的log_10()?

回答

11
from math import log 
[log(y,10) for y in x] 
+6

或使用'log10';)'这通常比log(x,10)更准确。' – phant0m 2012-07-25 19:07:51

25

numpy将为您做到这一点。

import numpy 
numpy.log10(mat) 

注意

mat并不一定是一个numpy的数组这个工作,并numpy应该比使用列表理解其他答案建议更快。

+0

太棒了!那就是诀窍。谢谢。 – 2012-07-25 19:11:09

+1

我毫不怀疑NumPy会做到这一点,并且做得非常快,但请记住,为某些简单的脚本安装NumPy有点矫枉过正。 – 2012-07-25 19:19:29

+2

谁说这是一些简单的脚本? – jmetz 2012-07-25 19:23:30

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

这叫做list comprehension。它正在做的是创建一个新列表,其元素是将math.log10应用到原始list中的相应元素(不是array)的结果,顺便说一下。

+0

我通常在循环结束时避免使用'for x in x',您不会再有'x'列表,只有最后一个元素。 – mgilson 2012-07-25 19:36:08

+0

@mgilson优秀点。我没有在我的解决方案评论中发布的示例代码中做这件事,不知道为什么我听到了(除了我在'textarea'中输入它,而不是'vim',我想)。我会解决这个问题。 – 2012-07-25 19:58:36

8

的simpliest的方法是使用一个list comprehension


实施例:

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

的另一种方法是使用map函数


示例:

>>> map(math.log10, x) 
[3.1760912590556813, 3.021106568432122, 1.5314789170422551, 2.545307116465824] 
>>> 
+0

非常感谢! – 2012-07-25 19:11:33

7

您也可以使用map内置函数:

import math 
new_list = map(math.log10, old_list) 

这将可能是微不足道比列表理解得更快。我在这里添加它主要是为了显示两者之间的相似性。

编辑(响应由@HankGay评论)

为了证明地图稍快在这种情况下,我写了一个小的基准:

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 24.5870189667 
list-comp 32.556563139 
map 23.2616219521 
list-comp 32.0040669441 
map 23.9995992184 
list-comp 33.2653431892 
map 24.1171340942 
list-comp 33.0399811268 
map 24.3114480972 
list-comp 33.5015368462 
map 24.296754837 
list-comp 33.5107491016 
map 24.0294749737 
list-comp 33.5332789421 
map 23.7013399601 
list-comp 33.1543111801 
map 24.41685009 
list-comp 32.9259850979 
map 24.1111209393 
list-comp 32.9298729897 

重要的是要认识到,速度不是一切,但。 “可读性很重要”。如果map创建了一些难以阅读的内容,那么肯定会列出理解。

+0

地图功能似乎是非常有用的。谢谢。 – 2012-07-25 19:11:52

+1

如果'map'比列表组件更快,我会非常震惊,至少在CPython上。 wazoo优化了列表组件的CPython实现。如果我得到一些停机时间,我可能会设置一个微基准测试,我们都知道这是一个非常有用的工具:-) – 2012-07-25 19:16:16

+0

@HankGay - 查看我的更新。对于这个简单的测试案例,“map”比等效列表comp快近50%。 – mgilson 2012-07-25 19:32:02