2017-07-30 93 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