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