在醫學影象處理領域,我們經常會需要讀取大量病人的影象。如何將這些影象全部讀取進來並存成乙個陣列是乙個經常遇到的問題。然而,在事前,我們通常只能知道每一張影象的尺寸是多少,而無法準確地知道一共有多少張(除非事前遍歷一遍)。
下面我們看一下這種方法的實現:
import numpy as np
arrays = np.empty((0
,3,512
,512))
#建立空陣列
for i in
range
(100):
image = np.ones(shape=(3
,512
,512))
#使用image模擬一張3通道,512×512的
data = image.reshape((1
,3,512
,512))
arrays = np.concatenate(
(arrays, data)
, axis=0)
print
(np.shape(arrays)
)print
(type
(arrays)
)
輸出:
(
100,3,
512,
512)
<
class
'numpy.ndarray'
>
可以看到,通過這種方法是可以實現動態陣列的。
那麼,它的效率如何呢?我們通過呼叫pycharm
的profile
模組檢視一下:
從**的第二行可以看出,該程式執行總耗時為21066ms,其中呼叫concatenate
函式耗時19863ms,佔94.3%之多。可見,整個程式的瓶頸就在concatenate
函式處。
那麼,有沒有其它替代的方法呢?
答案是肯定的。很簡單的,我們直接使用python
的list
來實現。
import numpy as np
arrays =
#建立空列表
for i in
range
(100):
data = np.ones(shape=(3
,512
,512))
#使用image模擬一張3通道,512×512的
arrays = np.array(arrays)
#將list轉換為numpy陣列
print
(np.shape(arrays)
)print
(type
(arrays)
)
輸出:
(
100,3,
512,
512)
<
class
'numpy.ndarray'
>
可以看到,通過list
一樣是可以實現動態陣列的。
那麼,它的效率又是怎麼樣呢?我們同樣通過呼叫pycharm
的profile
模組檢視一下:
從**的第二行可以看出,該程式執行總耗時僅為766ms,只有原程式的4%不到。
那麼,為什麼會出現這種情況呢?
這是因為,numpy
沒有動態改變陣列大小的功能,每次呼叫conconcatenate
時,系統會重新開闢記憶體生成乙個陣列,並將原來的陣列複製到新陣列中,這個過程是非常耗時的,所以導致整個程式變得非常緩慢。
所以,以後在處理大量資料的過程中,盡量不要呼叫conconcatenate
等函式
python高階用法 Python高階用法
python高階用法 三元表示式 x 10 y 20 print x if x y else y x 100 y 20 print x if x y else y 列表推導式和生成器 列表推導式 print i for i in range 10 print i 2 for i in range 1...
python 函式高階 python 函式高階
形參角度 萬能引數 動態接收位置引數 args 動態接收關鍵字引數 kwargs 的魔性用法 函式定義時 代表聚合。他將所有的位置引數 聚合成乙個元組,賦值給了args 函式定義時 將所有的關鍵字引數聚合成乙個字典中,將這個字典賦給了 kwargs 和 在函式的呼叫時 代表打散 僅限關鍵字引數 de...
python如何高階提公升 Python高階學習提公升
python高階學習提公升 01 轉殖專案 和專案初始版本說明.mp4 02 建立虛擬環境重建依賴項以及相關問題說明.mp4 03 docker安裝mysql和專案資料庫配置.mp4 04 解決pymysql和django2.2不相容問題和自動生成模型類.mp4 05 專案模型說明 百分號編碼 雜湊...