【问题标题】:Numpy matrix of arrays without copying possible?没有复制可能的数组的numpy矩阵?
【发布时间】:2026-01-27 10:10:02
【问题描述】:

我有一个关于 numpy 的问题,它是内存。是否可以在不复制多个 numpy 数组的情况下生成视图或其他内容?

   import numpy as np


    def test_var_args(*inputData):
        dataArray = np.array(inputData)
        print np.may_share_memory(inputData, dataArray) # prints false, b.c. of no shared memory

    test_var_args(np.arange(32),np.arange(32)*2)

我有一个带有图像的 c++ 应用程序,并且想做一些 python 魔术。我使用 c-api 将图像按行传递给 python 脚本,并希望在不复制它们的情况下组合它们。

我能够传递数据 s.t. c++ 和 python 共享相同的内存。现在我想将内存设置为 numpy 视图/数组或类似的东西。

c++ 中的图像不会连续出现在内存中(我对它们进行切片)。我交给 python 的行排列在一个连续的内存块中。

我传递的图像数量各不相同。如果存在预分配技巧,也许我可以改变它。

【问题讨论】:

  • 您可以使用list 容器来存储对每个原始数组的引用,而无需创建副本
  • 如果我使用列表,我将无法完成我想做的所有 numpy 事情。如果我将列表转换为 numpy 数组,将分配新内存。
  • numpy.array 有一个标志 copy。它默认设置为True,因此总是复制您的数据。您是否尝试过使用np.array(inputData, copy=False)
  • 这已经被问过了。 numpy 的数据缓冲区必须是连续的。因此,从其他数组构建数组需要副本。有一个 object dtype,但它只不过是一个列表的 numpy 版本。跨此类数组的数学是有限的。
  • np.ndarray 允许您从现有缓冲区创建数组。

标签: python c++ arrays numpy


【解决方案1】:

这里的答案中有一个有用的讨论:Can memmap pandas series. What about a dataframe?

简而言之:

  • 如果您从单个矩阵数组初始化 DataFrame,则它可能不会复制数据。
  • 如果您从多个相同或不同类型的数组进行初始化,您的数据将被复制。

这是 Pandas 的 DataFrame 使用的默认 BlockManager 允许的唯一行为,它在内部组织 DataFrame 的内存。

monkey patch the BlockManager 可以更改此行为,在这种情况下,您提供的数据将被引用。

【讨论】:

    最近更新 更多