【发布时间】:2022-01-05 02:38:17
【问题描述】:
根据numpy.ravel的文档,
返回一个连续的扁平数组。
返回一个包含输入元素的一维数组。仅在需要时才制作副本。
为了索引的方便和效率,我想要一个二维数组的一维视图。我正在使用ravel 创建视图,到目前为止一切顺利。
但是,我不清楚“仅在需要时制作副本”是什么意思。如果某天在我的代码执行时创建了一个副本,代码将停止工作。
我知道有numpy.reshape,但它的文档说:
在不复制数据的情况下改变数组的形状并不总是可能的。
无论如何,我希望数据是连续的。
如何可靠地创建二维数组和一维视图?我希望数据在内存中是连续的(为了提高效率)。在创建二维数组时是否需要指定任何属性以确保它是连续的并且ravel 不需要复制它?
相关问题:What is the difference between flatten and ravel functions in numpy?
【问题讨论】:
-
正如文档和提供的帖子所说,您无法在 Numpy 的内存中创建不连续的数组视图。您必须复制 2D 数组以使其连续(除非它已经是)或创建扁平版本的 1D 副本(这在内部几乎是相同的操作)。如果您不希望这样,那么您必须处理非连续视图。这种约束来自(虚拟)内存中的数据布局,无法避免(独立于 Numpy)。
-
@JérômeRichard,是否有文件保证(1)当我创建一个二维数组时,它将连续存储,(2)如果二维数组连续存储,@987654329 @不会复制吗?
-
(1) 我认为是的,但如果这很关键,您可以创建一个 1D 数组并将其重塑为 2D 数组以 100% 确定。 (2) 是的(除非您使用通常不使用的 F/C 订单)。您可以使用
arr.base检查一个数组是否是另一个数组的副本/视图。 -
猜测取决于您使用的顺序{'C','F','A','K'}。 @JérômeRichard 为什么 arr.base 而不是 numpy.shares_memory numpy.org/doc/stable/reference/generated/…
-
@pippo1980 确实如此。我不知道这个;)。谢谢。在实践中,我认为这两者可以在这里互换使用。
标签: numpy numpy-ndarray memory-layout