我读到Python实际上并不支持2D数组,而是数组的数组。我理解数组的数组,但支持2D数组意味着什么呢?在C语言中,2D数组可以通过一些复杂的数学运算(Seen here)简单地转换为1D数组。有实现实际2D数组的语言吗?谢谢你的帮助,我希望我没有写一个重复的问题;如果是这样,给予我一个链接,并关闭我的问题:)
oaxa6hgo1#
有一些语言可以实现2D(或3D等)数组。Fortran是其中之一。这意味着你可以写一个像array[x,y]这样的数组索引表达式,语言会处理数学问题以找到正确的元素。另外,Numpy是Python的一个数值扩展,提供了n维数组。
array[x,y]
jhdbpxl92#
有人已经提到了numpy,OP评论说"这又回到了C数组的花哨指针数学"--这完全是一个微不足道的实现细节! - )计算机可以被看作字节(或字)的数组,那么当然任何数据结构无论什么都在该数组(或其切片)的顶部实现,加上"花哨的指针数学"-双端队列、多维数组、二叉树,你能想到的,底层实现将总是归结为(就像所有花哨的控制结构归结为机器级的条件和无条件跳转一样,等等)。**那又怎么样?*?!当然,这些都是 * 实现 * 细节。numpy,就像Fortran和其他语言和库一样,提供N维数组--不管它如何在"内部深处"实现它们(实际上numpy在这方面非常坦率,因为你可以很容易地对数组进行扁平化和整形--这是Python的典型做法,它为更高层次的抽象提供了很好的"挂钩",说明它们与更低层次的抽象如何关联; -).例如:
numpy
>>> 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维数组"* 的意思 *(尽管在大多数其他提供这种支持的语言和框架中,你可能会得到更少的透明度、更低的功能,或者两者兼而有之; -).
yhived7q3#
C#有多维的arrays,但建议不要使用,因为交错数组(数组的数组)性能更好。
vcudknz34#
Fortran有真实的的多维数组。This link在FORTRAN 77案例中讨论了它们。
oalqel3c5#
我猜“支持2D数组”意味着语言允许你像访问2D数组一样访问数据。在c语言中,复杂的数学运算隐藏在数组结构中:
char arr[5][5]; char c = arr[2][3];
也有一种方法可以通过指针算术(您可能将其称为花式数学)来实现这一点。实际上内存是一大块可寻址的字节数据[0,1,2,3,4,5,6 ...内存末尾],所以没有二维数组的“原生”概念,有些地方必须将程序员的“行1列2”转换为内存中的实际地址。编程语言通常会给予你一种隐藏转换的方法。
hmae6n7t6#
Python中实际的数组(arrays)*-也就是array模块创建的array对象--是严格一维的,除非你的代码必须与C数据结构互操作,或者你要处理大量必须保存在内存中的数据,或者你要写类似numpy的东西,否则你可能不会使用它们。
array
qv7cva1a7#
罗塞塔代码有creating a two dimensional array的Python示例。
7条答案
按热度按时间oaxa6hgo1#
有一些语言可以实现2D(或3D等)数组。Fortran是其中之一。这意味着你可以写一个像
array[x,y]
这样的数组索引表达式,语言会处理数学问题以找到正确的元素。另外,Numpy是Python的一个数值扩展,提供了n维数组。
jhdbpxl92#
有人已经提到了
numpy
,OP评论说"这又回到了C数组的花哨指针数学"--这完全是一个微不足道的实现细节! - )计算机可以被看作字节(或字)的数组,那么当然任何数据结构无论什么都在该数组(或其切片)的顶部实现,加上"花哨的指针数学"-双端队列、多维数组、二叉树,你能想到的,底层实现将总是归结为(就像所有花哨的控制结构归结为机器级的条件和无条件跳转一样,等等)。**那又怎么样?*?!当然,这些都是 * 实现 * 细节。numpy
,就像Fortran和其他语言和库一样,提供N维数组--不管它如何在"内部深处"实现它们(实际上numpy在这方面非常坦率,因为你可以很容易地对数组进行扁平化和整形--这是Python的典型做法,它为更高层次的抽象提供了很好的"挂钩",说明它们与更低层次的抽象如何关联; -).例如:
您可以以高度灵活性和出色的性能对N维数组中的数据进行整形、索引、切片和成型--即使知道底层数据块只是一维数组(这里x是天生的,并且保持一维,但即使不是这样,您也可以通过展开来访问底层一维数组)。
这就是"支持N维数组"* 的意思 *(尽管在大多数其他提供这种支持的语言和框架中,你可能会得到更少的透明度、更低的功能,或者两者兼而有之; -).
yhived7q3#
C#有多维的arrays,但建议不要使用,因为交错数组(数组的数组)性能更好。
vcudknz34#
Fortran有真实的的多维数组。This link在FORTRAN 77案例中讨论了它们。
oalqel3c5#
我猜“支持2D数组”意味着语言允许你像访问2D数组一样访问数据。在c语言中,复杂的数学运算隐藏在数组结构中:
也有一种方法可以通过指针算术(您可能将其称为花式数学)来实现这一点。
实际上内存是一大块可寻址的字节数据[0,1,2,3,4,5,6 ...内存末尾],所以没有二维数组的“原生”概念,有些地方必须将程序员的“行1列2”转换为内存中的实际地址。编程语言通常会给予你一种隐藏转换的方法。
hmae6n7t6#
Python中实际的数组(arrays)*-也就是
array
模块创建的array
对象--是严格一维的,除非你的代码必须与C数据结构互操作,或者你要处理大量必须保存在内存中的数据,或者你要写类似numpy
的东西,否则你可能不会使用它们。qv7cva1a7#
罗塞塔代码有creating a two dimensional array的Python示例。