2014-02-18 43 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)