Python 什么是2D阵列支持?

Python 什么是2D阵列支持?,python,c,arrays,multidimensional-array,Python,C,Arrays,Multidimensional Array,我读到Python实际上不支持2D数组,而是支持数组的数组。我理解数组中的数组,但是支持2D数组意味着什么 在C语言中,通过做一些奇特的数学运算()可以将2D数组简单地转换为一维数组。有实现实际二维数组的语言吗 谢谢你的帮助,我希望我没有写重复的问题;如果是这样,请给我一个链接并关闭我的问题:)有些语言可以实现2D(或3D等)数组。Fortran就是其中之一。这意味着您可以编写一个数组索引表达式,如array[x,y],该语言将处理数学问题以找到正确的元素 此外,它是Python的一个数字扩展,

我读到Python实际上不支持2D数组,而是支持数组的数组。我理解数组中的数组,但是支持2D数组意味着什么

在C语言中,通过做一些奇特的数学运算()可以将2D数组简单地转换为一维数组。有实现实际二维数组的语言吗


谢谢你的帮助,我希望我没有写重复的问题;如果是这样,请给我一个链接并关闭我的问题:)

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


此外,它是Python的一个数字扩展,提供了n维数组。

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

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

我猜“支持2D数组”意味着该语言允许您像访问2D数组一样访问数据。在c中,奇特的数学被数组结构隐藏:

char arr[5][5];
char c = arr[2][3];
还有一种方法可以通过指针算法来实现这一点(您可能会将其称为花式数学)


实际上,内存是一大块可寻址的数据字节[0,1,2,3,4,5,6…内存末尾],因此没有2D数组的“本机”概念,某些地方必须将程序员的“第1行第2列”转换为内存中的实际地址。编程语言通常给你一种隐藏翻译的方法。

有人已经提到了
numpy
,OP评论说“这又回到了使用C数组的奇特指针数学”——这完全是一个微不足道的实现细节!由于(普通;-)计算机中的底层内存可以看作是字节(或单词)数组,那么当然任何数据结构都是在该数组(或其切片)的顶部加上“奇特的指针数学”——双端队列、多维数组、二叉树,你可以说,底层实现总是归结为这一点(就像所有奇特的控制结构归结为机器级的有条件和无条件跳转,等等)那又怎样?!当然,这些是实现细节
numpy
,就像Fortran和其他语言和库一样,提供了N维数组——不管它是如何在“内部”实现它们的(实际上numpy在这方面做得很好,因为你可以很容易地展平和重塑数组——它是Python的典型,能够提供具有相当好的“挂钩”的更高级别抽象关于它们与较低级别的关系;-)

例如:

您可以以高灵活性和优异的性能在N维数组中重塑、索引、切片和塑形数据——即使知道底层数据块只是那个一维数组(这里x出生并保持为一维,但即使不是这样,您仍然可以通过展平来访问底层的一维数组)


这就是“支持N维数组”的含义(尽管在大多数提供这种支持的其他语言和框架中,您可能会获得更少的透明度、更低的功能,或者两者兼而有之;-)。

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

的东西,Rosetta代码有Python示例。

numpy使用C扩展,因此它回到了使用C数组的奇特指针数学。numpy的作者使用了奇特的指针数学。作为it的用户,你不必这么做。你对此有参考资料吗?请注意,“performant”的使用增加了麻烦。看见
>>> 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]])
>>>