編譯 | AI科技大本營(rgznai100)
參與 | 林椿眄
編輯 | Donna
Python 已經成為機器學習及其他科學領域中的主流語言。它不但與多種深度學習架構相容,而且還包含優秀的工具包和依賴庫,方便我們對資料進行預先處理和可視化操作。
據最新訊息,到2019 年底,Numpy 等很多科學計算工具包都將停止支援Python 2版本,而 2018 年後 Numpy 的所有新功能版本也都將只支援 Python 3。
為了使初學者能夠輕鬆地從 Python 2 向 Python 3 實現遷移,我收集了一些 Python 3 的功能,希望對大家有所協助。
▌使用 pathlib 模組來更好地處理路徑
pathlib 是 Python 3預設的用於處理資料路徑的模組,它能夠協助我們避免使用大量的 os.path.joins語句:
from pathlib import Path
dataset = 'wiki_images'
datasets_root = Path('/path/to/datasets/')
train_path = datasets_root / dataset / 'train'
test_path = datasets_root / dataset / 'test'
for image_path in train_path.iterdir():
with image_path.open() as f: # note, open is a method of Path object
# do something with an image
向左滑動查看完整代碼
在Python2中,我們需要通過級聯字串的形成來實現路徑的拼接。而現在有了pathlib模組後,資料路徑處理將變得更加安全、準確,可讀性更強。
此外,pathlib.Path含有大量的方法,這樣Python的初學者將不再需要搜尋每個方法:
p.exists()
p.is_dir()
p.parts()
p.with_name('sibling.png') # only change the name, but keep the folder
p.with_suffix('.jpg') # only change the extension, but keep the folder and the name
p.chmod(mode)
p.rmdir()
使用pathlib還將大大節約你的時間。更多功能請查看:
官方文檔 - https://docs.python.org/3/library/pathlib.html
參考資訊 - https://pymotw.com/3/pathlib/
▌類型提示(Type hinting)成為Python3中的新成員
下面是在編譯器PyCharm 中,類型提示功能的一個樣本:
Python 不只是一門指令碼的語言,如今的資料流程還包括大量的邏輯步驟,每一步都包括不同的架構(有時也包括不同的邏輯)。
Python3中引入了類型提示工具包來處理複雜的大型項目,使機器可以更好地對代碼進行驗證。而在這之前,不同的模組需要使用自訂的方式,對文檔中的字串指定類型 (注意:PyCharm可以將舊的文檔字串轉換成新的類型提示)。
下面是一個簡單的程式碼範例,利用類型提示功能來處理不同類型的資料:
def repeat_each_entry(data):
""" Each entry in the data is doubled
<blah blah nobody reads the documentation till the end>
"""
index = numpy.repeat(numpy.arange(len(data)), 2)
return data[index]
上述代碼對多維的 numpy.array、astropy.Table 和 astropy.Column、bcolz、cupy、mxnet.ndarray 等操作同樣適用。
這段代碼還可用於 pandas.Series 操作,但是這種形式是錯誤的:
repeat_each_entry(pandas.Series(data=[0, 1, 2], index=[3, 4, 5])) # returns Series with Nones inside
這僅僅是一段兩行的代碼。所以,複雜系統的行為是非常難預測的,有時一個函數就可能導致整個系統的錯誤。因此,明確地瞭解哪些類型方法,並在這些類型方法未得到相應參數的時候發出錯誤提示,這對於大型系統的運作是很有協助的。
def repeat_each_entry(data: Union[numpy.ndarray, bcolz.carray]):
如果你有一個很棒的程式碼程式庫,諸如 MyPy這樣的類型提示工具將可能成為一個大型項目的整合流程中的一部分。不幸的是,類型提示功能還沒辦法強大到為 ndarrays/tensors 這種細粒度類型發出提示。或許,不久的將來我們就可以擁有這樣全面的的類型提示工具,這將成為資料科學領域需要的強大功能。
▌從類型提示(運行前)到類型檢查(運行時)
預設情況下,函數的注釋對於代碼的運行是沒有影響的,它只是幫你指出每段代碼所要做的工作。
在代碼運行階段,很多時候類型提示工具是不起作用的。這種情況你可以使用 enforce 等工具,強制性對代碼進行類型檢查,同時也可以協助你調試代碼。
@enforce.runtime_validation
def foo(text: str) -> None:
print(text)
foo('Hi') # ok
foo(5) # fails
@enforce.runtime_validation
def any2