2012-07-25 38 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