2014-02-18 70 views

回答

5

更「matrixy」答案是使用numpy的的object D型:例如:

>>> import numpy as np 
>>> np.ndarray(shape=(5,6), dtype=np.object) 
array([[None, None, None, None, None, None], 
     [None, None, None, None, None, None], 
     [None, None, None, None, None, None], 
     [None, None, None, None, None, None], 
     [None, None, None, None, None, None]], dtype=object) 

但是,正如WIM表明,這可能是低效的,如果你用這個做數學。

>>> mat = np.empty(shape=(5,6)) 
>>> mat.fill(np.nan) 
>>> mat 
array([[ nan, nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan, nan]]) 
>>> 

如果你真的使用更多的Python對象的東西,並不打算填充矩陣,你可以使用更好的東西;一個dict

>>> from collections import defaultdict 
>>> mat = defaultdict(lambda: None) 
>>> mat[4,4] 
>>> mat[4,4] is None 
True 
+0

但我需要超過5或6個元素! :\ –

+0

用你想要的尺寸替換'shape =(...)'。你可以使用任何你喜歡的尺寸! – SingleNegationElimination

+2

如果您打算在數組中使用數字,那麼使用'np.nan'比None/dtype = object更有意義。如果你「不關心」數值是什麼,請使用np.empty。 – wim

2
matrix = [] 
for i in xrange(M): 
    matrix.append([None]*N) 
+0

感謝您的回答!有沒有更短的指令?最好! –

+0

看看別人的答案,他們很不錯。 –

+0

是的!謝謝! :) –

3
matrix = [[None]*N for _ in xrange(M)] 

不要做[[None]*N]*M,否則你會得到它的M元素都是真正同一列表對象的列表。

請注意,這不是一個真正的矩陣;這是一個列表清單。試圖執行諸如max(matrix)之類的操作將無法正常工作,如果您嘗試將矩陣的元素設置爲列表,則無法區分您的數據結構是否應該是列表矩陣,列表矩陣或3D矩陣。如果你想做很多矩陣操作,強烈建議使用NumPy。它提供了具有高性能和非常方便的語法的實際矩陣和任意維數組。

+0

謝謝@ user2357112您的強大答案!不幸的是,我無法在6分鐘內接受答案! –

0

numpy的有empty ndarray創建方法

numpy.empty(shape, dtype, order) 

爲矩陣matlib.empty

numpy.matlib.empty(shape, dtype, order)