2017-07-30 96 views
2

我正在使用Python 3,並試圖創建已知和固定大小的2D整數數組。我怎樣才能做到這一點?在Python 3中有效地初始化n * m大小的二維數組?

我想到的數組是Python提供的array.array,雖然我不反對使用類似NumPy的庫。

我知道這可以通過列表完成,但我想使用一個數組,因爲它們更節省空間。現在,我正在初始化列表以這種方式,但我想用一個數組來替代它:

my_list = [[ 0 for _ in range(height) ] for _ in range(.width)]

例如,在C,我會寫

int my_array[ width ][ height ];

如何我這樣做在Python

+0

是您打開使用numpy的? –

+0

那麼,你究竟是什麼**你是否指數組? 'numpy.ndarray'?或'array.array'? –

+0

請發佈一個簡單的例子。什麼是實際的數據類型? https://docs.python.org/3/library/array.html? – wwii

回答

2

您可以使用numpy的:

import numpy as np 
my_array = np.zeros([height, width]) 

例如:

>>> np.zeros([3, 5]) 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

請注意,如果你特別需要整數,你應該使用dtype參數

>>> np.zeros([3, 5], dtype=int) 
array([[0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0]]) 
+0

這些空間是否像'''array.array''s一樣高效?我將要使用的整數陣列預計在〜1000x1000的數量級。 編輯:我做了一些Numpy文檔的閱讀,好像我可以指定數組來使用int-8類型,我目前正在試圖找出每個元素有多少開銷。 – tpepin96

+1

@ tpepin96是的,他們是。儘管如此,鑑於您所談論的維度,即使列表列表也不會成爲現代硬件上的問題。 –

+0

@ tpepin96它們是原始數組,因此每個元素都是'dtype'暗示的任何大小... –

0

您發佈的代碼的numpy的當量是:

import numpy as np 
my_array = np.empty([height, width]) 

empty保留未初始化的空間,因此它比zeros稍快,因爲zeros必須確保所有內容最初設置爲0.

請注意,與在C/C++中一樣,在讀取它們之前應先寫入值,因爲它們最初「包含垃圾」。

文檔:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.empty.html

https://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html