如何在Python中访问方形数组的长度?

时间:2012-02-17 04:28:41

标签: python

假设我有一个数组map [x] [y],我不知道数组的高度或宽度。 array.length()将返回整体高度*宽度,但如果我想知道高度和宽度是独立的呢?这可能通过python内置实用程序吗?

3 个答案:

答案 0 :(得分:4)

我想你正试图在二维地图上编写某种游戏。

Python没有C或C ++意义上的多维数组(它们本身只是围绕一维数组的语法糖。)相反,Python有列表,这是严格的一维事件。

您可以通过创建包含其他列表的列表来伪造二维数组。像这样:

width = 10
height = 10
map = [ [None]*width for i in range(height) ]

你可以通过以下方式获得宽度和高度:

height = len(map)
width = len(map[0])

如果map的每个子列表长度相同,即map是列表的矩形列表,则只会给出预期结果。 Python不会为你强制执行此限制(为什么会这样?)所以你必须自己强制执行。

如另一个答案中所述,numpy具有针对数值数学优化的真实N维数组。


旁注:请注意使用列表推导map = [ [None]*width for i in range(height)]而不是以下内容:

map = [ [None]*width ] * height

具有意想不到的效果:

>>> a = [ [0] * 3 ] * 3 #create a 3x3 array of zeroes
>>> a
[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]]
>>> a[1][1] = 9 #change the number in the middle of the grid to '9'
>>> a
[[0, 9, 0],   # wtf?
 [0, 9, 0],
 [0, 9, 0]]   # wtf?

这是因为数组的[list] * n运算符不会生成n list个新副本。相反,它会将引用n个副本复制到list。更改其中一个list引用将全部更改。

答案 1 :(得分:0)

数组是一维数组。如果您想要多维,请查看标准Python列表。见http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange

请注意,对于列表,您可以获取列表的“高度”(“行”数),但行不必包含相同数量的列,因此您不能直接获得宽度。你可以找到最短的行,最长的行,平均的行等,但是你需要循环遍历列表才能完成它。

根据您正在做的事情,您可能会考虑使用numpy

答案 2 :(得分:0)

免责声明:我根本不懂python,但我想看看:)

查看此page,看起来好像是在map.ndim

之后

修改

嗯,看起来我偶然发现了一个名为 NumPy

的图书馆

编辑2

在您的情况下,

map.ndim将为2,即 - 数组中的维数。 map.shape将为您提供一个描述数组维度的整数元组。在你的情况下2,2 - 所以你需要map.shape[1]来获得数组的宽度。