2D数组支持是什么意思?
我看到有人说Python其实不支持二维数组,而是支持数组中的数组。我明白数组中的数组是什么意思,但说支持二维数组又是什么意思呢?
在C语言中,二维数组其实可以通过一些复杂的数学运算转换成一维数组(可以在这里看到)。有没有语言是直接实现真正的二维数组的呢?
谢谢你的帮助,希望我没有重复提问;如果是的话,请给我个链接并关闭我的问题 :)
7 个回答
C# 语言支持多维数组,也就是可以有多个维度的数组。不过,大家通常不推荐使用这种多维数组,因为“锯齿数组”(就是数组里面再放数组)在性能上表现得更好。
有人提到过 numpy
,而提问者评论说“这又回到了用C数组做复杂指针运算”——这其实是个很简单的实现细节!因为在普通电脑里,底层的内存可以看作是一个字节(或字)的数组,所以当然,任何数据结构都是建立在这个数组(或它的切片)之上的,加上“复杂的指针运算”——双端队列、多维数组、二叉树等等,底层的实现最终都会归结为这一点(就像所有复杂的控制结构在机器层面上都归结为条件跳转和无条件跳转一样)。那又怎么样呢?!这些都是实现细节,当然了。numpy
就像Fortran和其他语言及库一样,提供N维数组——无论它是如何在“深层”实现这些的(其实numpy对此很透明,你可以很容易地将数组展平和重塑——在Python中,提供更高层次的抽象并且能很好地与底层结构关联是很常见的;-)。
例如,
>>> import numpy
>>> x = numpy.arange(12)
>>> x
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> x.reshape((3,4))
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> x.reshape((4,3))
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
>>> x.reshape((4,3))[::2, ::2]
array([[0, 2],
[6, 8]])
>>> x.reshape((4,3))[(0,1,3), ::2]
array([[ 0, 2],
[ 3, 5],
[ 9, 11]])
>>>
你可以灵活地重塑、索引、切片和处理N维数组中的数据,性能也非常优秀——即使你知道底层的数据块其实就是那一个一维数组(这里x是生来就是一维的,但即使不是,你仍然可以通过展平来访问底层的一维数组)。
这就是“支持N维数组”的意思(不过在大多数其他语言和框架中提供这种支持时,你可能会得到更少的透明度、较低的功能,或者两者都有;-)。
有些编程语言可以使用二维(或者三维等)数组,Fortran就是其中之一。这意味着你可以写一个数组索引表达式,比如 array[x,y]
,然后语言会自动帮你计算出正确的元素。
另外,Numpy 是一个为Python提供的数值扩展,它可以处理多维数组。