python 2D阵列支持意味着什么?

ifmq2ha2  于 2023-01-01  发布在  Python
关注(0)|答案(7)|浏览(135)

我读到Python实际上并不支持2D数组,而是数组的数组。我理解数组的数组,但支持2D数组意味着什么呢?
在C语言中,2D数组可以通过一些复杂的数学运算(Seen here)简单地转换为1D数组。有实现实际2D数组的语言吗?
谢谢你的帮助,我希望我没有写一个重复的问题;如果是这样,给予我一个链接,并关闭我的问题:)

oaxa6hgo

oaxa6hgo1#

有一些语言可以实现2D(或3D等)数组。Fortran是其中之一。这意味着你可以写一个像array[x,y]这样的数组索引表达式,语言会处理数学问题以找到正确的元素。
另外,Numpy是Python的一个数值扩展,提供了n维数组。

jhdbpxl9

jhdbpxl92#

有人已经提到了numpy,OP评论说"这又回到了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维数组"* 的意思 *(尽管在大多数其他提供这种支持的语言和框架中,你可能会得到更少的透明度、更低的功能,或者两者兼而有之; -).

yhived7q

yhived7q3#

C#有多维的arrays,但建议不要使用,因为交错数组(数组的数组)性能更好。

vcudknz3

vcudknz34#

Fortran有真实的的多维数组。This link在FORTRAN 77案例中讨论了它们。

oalqel3c

oalqel3c5#

我猜“支持2D数组”意味着语言允许你像访问2D数组一样访问数据。在c语言中,复杂的数学运算隐藏在数组结构中:

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

也有一种方法可以通过指针算术(您可能将其称为花式数学)来实现这一点。
实际上内存是一大块可寻址的字节数据[0,1,2,3,4,5,6 ...内存末尾],所以没有二维数组的“原生”概念,有些地方必须将程序员的“行1列2”转换为内存中的实际地址。编程语言通常会给予你一种隐藏转换的方法。

hmae6n7t

hmae6n7t6#

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

相关问题