关于python:2D数组支持是什么意思?

What is meant by 2D array support?

我读到Python实际上并不支持2D数组,而是支持数组的数组。 我了解数组中的数组,但是支持2D数组是什么意思?

在C语言中,通过做一些奇特的数学运算即可将2D数组简单地转换为1D数组(见此处)。 有没有实现实际2D数组的语言?

感谢您的帮助,我希望我没有写过重复的问题; 如果是这样,给我一个链接,然后关闭我的问题:)


有些语言实现2D(或3D等)数组。 Fortran是其中之一。这意味着您可以编写像array[x,y]这样的数组索引表达式,该语言将照顾好数学以找到正确的元素。

同样,Numpy是对Python的数字扩展,提供了n维数组。


有人已经提到了numpy,OP则评论说"它又回到了C数组的奇特指针数学" —这是一个非常琐碎的实现细节!由于(普通;-)计算机中的基础内存可以看作是字节(或字)的数组,因此当然可以在该数组(或其片段)的顶部实现任何数据结构,还要加上"花式指针数学"-双端队列,多维数组,二叉树(您将其命名),底层实现将始终归结为这一点(就像所有复杂的控制结构归结为在机器级别进行有条件和无条件的跳转一样,依此类推)。所以呢?!当然,这些是实施细节。 numpy就像Fortran和其他语言和库一样,提供N维数组-不管它是如何"深入内部"实现的(实际上numpy都非常了解这一点,因为您可以轻松地展平和整形数组-它是Python的典型代表,可以为高层抽象提供与它们与低层抽象之间的联系的良好"钩子" ;-)。

例如。,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> 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维数组的支持"的含义(尽管在大多数其他提供这种支持的语言和框架中,您可能会获得较低的透明度,较低的功能或同时获得这两者;-)。


C#具有多维数组,但建议不要使用它们,因为锯齿状数组(数组的数组)性能更高。


Rosetta Code提供了用于创建二维数组的Python示例。


Python中的实际数组-即array模块创建的array对象-严格是一维的。除非您的代码必须与C数据结构进行互操作,正在处理必须保存在内存中的大量数据,或者正在编写类似numpy之类的东西,否则它们也是您可能不会使用的东西。


我猜"支持2D数组"意味着该语言如何允许您像访问2D数组一样访问数据。在c中,花式数学被数组构造隐藏:

1
2
char arr[5][5];
char c = arr[2][3];

也有一种方法可以通过指针算术来完成(您可能将其称为幻想数学)。

实际上,内存是一大堆可寻址的数据字节[0,1,2,3,4,5,6 ...内存末尾],因此没有2D数组的"本机"概念,某些地方必须翻译程序员将"行1列2"到内存中的实际地址。编程语言通常为您提供隐藏翻译的方法。


Fortran具有真正的多维数组。此链接在FORTRAN 77案例中讨论它们。