歡迎光臨
每天分享高質量文章

獨家 | 帶你入門比Python更高效的Numpy(附程式碼)

作者:TIRTHAJYOTI SARKAR ;翻譯:閆曉雨 ;校對:Uynix

本文約1790字,建議閱讀4分鐘。

資料科學家介紹了向量化技巧,簡單的數學變化可以透過可迭代物件執行。

簡介

向量化技巧對於資料科學家來說是相當熟知的,並且常用於程式設計中,以加速整體資料轉換,其中簡單的數學變化透過可迭代物件(例如串列)執行。未受到重視的是,把有一定規模的程式碼模組,如條件迴圈,進行向量化,也能帶來一些好處。

正文


Python正在迅速成為資料科學家的程式設計實戰語言但與R或Julia不同的是,它是通用型程式語言,沒有功能語法來立即開始分析和轉換數值資料。所以,它需要專門的庫。


Numpy是Numerical Python的縮寫,是Python生態系統中高效能科學計算和資料分析所需的基礎軟體包。它是幾乎所有高階工具(如Pandasscikit-learn)的基礎。


TensorFlow使用NumPy陣列作為基礎構建模組,在這些模組的基礎上,他們為深度學習任務(在長串列/向量/數字矩陣上大量使用線性代數運算)構建了張量物件(Tensor objects)和圖形流(graphflow)許多Numpy操作都是用C語言實現的,避免了Python中迴圈的基本代價,即指標間接定址和每個元素的動態型別檢查。速度的提升取決於您正在執行的操作。對於資料科學和現代機器學習的任務來說,這是一個非常寶貴的優勢。


我最近一篇文章講了使Numpy向量化簡單資料轉換任務的優勢,它引起了一些聯想,並受到讀者的歡迎。關於程式碼簡化等向量化的效用,也有一些有趣的討論。

 

現在,基於某些預定義條件的數學轉換在資料科學任務中相當普遍。事實證明,透過首先轉換為函式然後使用numpy.vectorize方法,可以輕鬆地對條件迴圈的簡單模組進行向量化。在我之前的文章中,我展示了Numpy向量化簡單數學變換後一個數量級的速度提升。對於目前的情況來說,由於內部條件迴圈仍然效率低下,速度提升並不那麼顯著。但是,與其他純粹Python程式碼相比,執行時間至少要提高20-50%。

 

以下是演示它的簡單程式碼:

import numpy as np

from math import sin as sn

import matplotlib.pyplot as plt

import time

 

# 測試數量

N_point = 1000

 

# 定義一個有if else迴圈的函式

def myfunc(x,y): 

  if (x>0.5*y and y<0.3): return (sn(x-y)) 

  elif (x<0.5*y): return 0 

  elif (x>0.2*y): return (2*sn(x+2*y)) 

  else: return (sn(y+x))

 

# 從正態分佈產生儲存元素的串列

lst_x = np.random.randn(N_point)

lst_y = np.random.randn(N_point)

lst_result = []

 

# 可選擇畫出資料分佈

plt.hist(lst_x,bins=20)


plt.show()

plt.hist(lst_y,bins=20)

plt.show()

 

# 首先,純粹的Python程式碼

t1=time.time()

First, plain vanilla for-loop

t1=time.time()

for i in range(len(lst_x)):

    x = lst_x[i]

    y= lst_y[i]

    if (x>0.5*y and y<0.3):

        lst_result.append(sn(x-y))

    elif (x<0.5*y):

        lst_result.append(0)

    elif (x>0.2*y):

        lst_result.append(2*sn(x+2*y))

    else:

        lst_result.append(sn(y+x))

t2=time.time()

 

print(“\nTime taken by the plain vanilla for-loop\n———————————————-\n{} us”.format(1000000*(t2-t1)))

 

# List comprehension

print(“\nTime taken by list comprehension and zip\n”+’-‘*40)

%timeit lst_result = [myfunc(x,y) for x,y in zip(lst_x,lst_y)]

 

# Map() 函式

print(“\nTime taken by map function\n”+’-‘*40)

%timeit list(map(myfunc,lst_x,lst_y))

 

# Numpy.vectorize 方法

print(“\nTime taken by numpy.vectorize method\n”+’-‘*40)

vectfunc = np.vectorize(myfunc,otypes=[np.float],cache=False)

%timeit list(vectfunc(lst_x,lst_y))

 

# 結果

Time taken by the plain vanilla for-loop

———————————————-

2000.0934600830078 us

 

Time taken by list comprehension and zip

—————————————-

1000 loops, best of 3: 810 µs per loop

 

Time taken by map function

—————————————-

1000 loops, best of 3: 726 µs per loop

 

Time taken by numpy.vectorize method

—————————————-

1000 loops, best of 3: 516 µs per


請註意,我已經在任何可以把運算式用一行陳述句來實現的地方使用了%timeit Jupyter魔術命令。這樣我就可以有效執行超過1000個相同運算式的迴圈,來計算平均執行時間以避免任何隨機效應。因此,如果您在Jupyter Notebook中執行整個指令碼,則可能會出現與第一種情況(即普通迴圈執行)略有不同的結果,但接下來的三種應該會給出非常一致的趨勢(基於您的計算機硬體)。


我們看到的證據表明,對於基於一系列條件檢查的資料轉換任務,與一般Python方法相比,使用Numpy的向量化方法通常會使速度提高20-50%。


這貌似不是一個顯著改進,但節省的每一點時間都可以加入資料科學工作流程中,從長遠來看是值得的!如果資料科學工作要求這種轉換髮生一百萬次,那麼可能會導致短則八小時,長則兩天的差異。


簡而言之,任何時候你有長的資料串列並需要對它們進行數學轉換,都應強烈考慮將這些Python資料結構(串列或元組或字典)轉換為numpy.ndarray物件並使用自帶的向量化功能。


Numpy提供了一個用於更快程式碼執行的C應用程式介面(C-API),但是它失去了Python程式設計的簡單性。這個Scipy講義能告訴你在這方面的所有相關選項。


法國神經科學研究人員撰寫了關於該主題的完整開源線上書籍。看看這裡


作者的話


如果您有任何問題或想法可以分享,請聯絡作者tirthajyoti [AT] gmail.com您也可以在作者的GitHub倉庫以獲取Python,R或MATLAB的程式碼片段以及機器學習相關資源。如果你像我一樣熱衷於機器學習/資料科學/半導體,請隨時在LinkedIn新增我


作者簡介

Tirthajyoti Sarkar ,半導體從業人員,資料科學與機器學習愛好者。使用Python\R\Matlab進行資料科學和機器學習的實踐者。半導體專業人員。伊利諾伊大學電子工程博士。在三藩灣區生活與工作。


原文標題:

Data science with Python: Turn your conditional loops to Numpy vectors

原文連結:

https://www.codementor.io/tirthajyotisarkar/data-science-with-python-turn-your-conditional-loops-to-numpy-vectors-he1yo9265

譯者簡:閆曉雨,本科畢業於北京林業大學,即將就讀於南加州大學應用生物統計與流行病碩士專案。繼續在生統道路上摸爬滾打,熱愛資料,期待未來。

關聯閱讀

原創系列文章:

1:從0開始搭建自己的資料運營指標體系(概括篇)

2 :從0開始搭建自己的資料運營指標體系(定位篇)

3 :從0開始搭建自己的資料運營體系(業務理解篇)

4 :資料指標的構建流程與邏輯

5 :系列 :從資料指標到資料運營指標體系

6:   實戰 :為自己的公號搭建一個資料運營指標體系

資料運營 關聯文章閱讀:  

運營入門,從0到1搭建資料分析知識體系    

推薦 :資料分析師與運營協作的9個好習慣

乾貨 :手把手教你搭建資料化使用者運營體系

推薦 :最用心的運營資料指標解讀

乾貨 : 如何構建資料運營指標體系

從零開始,構建資料化運營體系

乾貨 :解讀產品、運營和資料三個基友關係

乾貨 :從0到1搭建資料運營體系

資料分析、資料產品 關聯文章閱讀:

乾貨 :資料分析團隊的搭建和思考

資料分析師必需具備的10種分析思維。

如何構建大資料層級體系,看這一文章就夠了

乾貨 : 聚焦於使用者行為分析的資料產品

如何構建大資料層級體系,看這一文章就夠了

80%的運營註定了打雜?因為你沒有搭建出一套有效的使用者運營體系

從底層到應用,那些資料人的必備技能

讀懂使用者運營體系:使用者分層和分群

做運營必須掌握的資料分析思維,你還敢說不會做資料分析

商務合作|約稿 請加qq:365242293  


更多相關知識請回覆:“ 月光寶盒 ”;

資料分析(ID : ecshujufenxi )網際網路科技與資料圈自己的微信,也是WeMedia自媒體聯盟成員之一,WeMedia聯盟改寫5000萬人群。

贊(0)

分享創造快樂