【问题标题】:What is meant by 2D array support?二维数组支持是什么意思?
【发布时间】:2010-12-14 11:43:48
【问题描述】:

我读到 Python 实际上并不支持 2D 数组,而是支持数组的数组。数组的东西我理解,但是支持二维数组是什么意思呢?

在 C 中,通过一些花哨的数学运算 (Seen here) 将 2D 数组简单地转换为 1D 数组。有没有实现实际二维数组的语言?

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

【问题讨论】:

    标签: python c arrays multidimensional-array


    【解决方案1】:

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

    另外,Numpy 是 Python 的数值扩展,提供 n 维数组。

    【讨论】:

    • Numpy 使用 C 扩展,因此它回到了使用 C 数组的花哨的指针数学。
    • numpy 的作者使用了精美的指针数学。作为它的用户,您不必这样做。
    【解决方案2】:

    Fortran 有真正的多维数组。 This link 在 FORTRAN 77 案例中谈到它们。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      【解决方案4】:

      我猜“支持 2D 数组”是指语言如何允许您像访问 2D 数组一样访问数据。在 c 中,花哨的数学被数组结构隐藏了:

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

      还有一种方法可以通过指针算术(您可能将其称为花式数学)来做到这一点。

      实际上,内存是一大块可寻址的数据字节 [0,1,2,3,4,5,6 ... 内存结束],因此没有二维数组的“原生”概念,在某处必须将程序员“第 1 行第 2 行”转换为内存中的实际地址。编程语言通常会为您提供隐藏翻译的方法。

      【讨论】:

        【解决方案5】:

        有人已经提到了numpy,并且 OP 评论说“它回到了 C 数组的花哨的指针数学”——这是一个完全微不足道的实现细节!由于(普通;-)计算机中的底层内存可以看作是一个字节(或单词)数组,那么当然任何数据结构whatsoever都是在该数组(或其切片)的顶部加上“花哨的指针数学”——双端队列、多维数组、二叉树,你的名字,底层实现总是归结为那个(就像所有花哨的控制结构一样归结为机器级别的条件和无条件跳转,等等)。 那又怎样?!当然,这些是实现细节。 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 维数组的支持”的意思(尽管在大多数其他提供此类支持的语言和框架中,您可能会获得较低的透明度、较低的功能,或两者兼而有之;-)。 p>

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            Rosetta Code 包含creating a two dimensional array 的 Python 示例。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-08
              • 2012-11-29
              • 2015-01-22
              • 2020-04-04
              • 1970-01-01
              相关资源
              最近更新 更多