【问题标题】:What does the order parameter in numpy.array() do AKA what is contiguous order?numpy.array() 中的 order 参数做什么 AKA 什么是连续顺序?
【发布时间】:2015-01-31 16:45:32
【问题描述】:

numpy.array()中的order参数有什么作用?

它在我链接到的文档中说它将指定数组的连续顺序,但我不知道这应该是什么意思。那么什么是连续顺序呢?

订单参数文档副本:

顺序:{‘C’、‘F’、‘A’},可选 指定数组的顺序。如果 order 为“C”(默认),则数组将按 C 连续顺序排列(last-index 变化最快)。如果 order 为“F”,则返回的数组将采用 Fortran 连续顺序(第一个索引变化最快)。如果 order 为“A”,则返回的数组可以是任何顺序(C-、Fortran-连续,甚至不连续)。

【问题讨论】:

  • 我认为它与数组在内存中的表示方式有关。默认情况下,它将是内存中连续的字节序列。
  • 主要的好处是复制这样的数组会非常非常快。您只需将一个内存区域作为一个整体复制到另一个区域,而不是逐个元素地复制。这可以在 C/C++ 中使用 memcpy 来完成。
  • 几个可能对herehere有帮助的问题。
  • C 和 F 之间的区别只是数组是行主要还是列主要(即行或列条目存储在相邻的内存地址中)。 C 顺序意味着在阵列上操作 row-rise 会稍微快一些。 F 顺序意味着按列操作会更快。指定A 意味着创建的数组不需要有任何顺序 - 它允许在内存中不连续(例如,如果数组a 不连续,那么a.copy('A') 也可能是不连续的)。

标签: python c arrays numpy


【解决方案1】:

让我们首先解开 K A CF 代表的内容。我指的是this的实现细节部分。

  • C 是连续布局。从数学上讲,行专业。
  • F 是 Fortran 连续布局。从数学上讲,专栏专业。
  • A 是任何订单。一般不用这个。
  • K 保持秩序。一般不用这个。

从这里我可以向您推荐解决以下两个问题的其他答案:数据连续性和行与列主要排序。行与列的主要排序最好用 Wikipedia article 来描述。所以现在让我们谈谈数据连续性。在 python 中,这通常不是那么重要,所以我将在这里跳到 C 语言。

在 C 中,有两种存储二维数组的选项。

  1. An array of arrays
  2. A flattened array

在第一个示例中,我们存储在数组中的数据类型是另一个数组。就指针而言,我们有一块内存,其中的每个值都是指向另一块内存的指针。为了在任何时候找到一个值,我们必须先取消引用外部数组,然后再取消引用内部数组。

在第二个示例中,我们有一个大小为rows * columns 的内存块。我们可以取消引用任何索引以获取其值。但是索引是一维的。可以使用y + x * width 转换二维索引。

在进行数值计算时,我们努力使用连续数组。原因是 numpy 所依赖的缓存加速。如果我想将值 a 添加到 2D 数组中的每个值,我可以将整个展平数组移动到缓存中(如果合适)。但是,您只能将单个列(或行)移动到数组数组的缓存中。想了解更多,请查阅SIMD【同指令多数据】。

【讨论】:

  • 您混淆了 C 数组的工作方式和 Java 数组的工作方式。您的“数组数组”图像来自 Java 课程。
  • 是的,它来自 java 课程,但概念是一样的。您有一个 C 数组 C 数组,本质上是一个指向内存块的指针,其中包含多个指向其他内存块的指针。内存不连续。
  • C 数组不是这样工作的。这就是将 C 指针指向指向更多数组的 C 指针数组的工作原理。数组的 C 数组是连续的,其布局与 C 连续的 NumPy 多维数组相同。 (这就是为什么它被称为 C-contiguous。)
猜你喜欢
  • 2012-02-26
  • 2013-08-30
  • 2020-01-30
  • 1970-01-01
  • 2013-06-15
  • 2014-08-14
  • 2016-08-27
  • 2016-08-27
  • 1970-01-01
相关资源
最近更新 更多