在没有中间的情况下重塑数据时的numpy复制数据

时间:2016-03-31 00:36:40

标签: python arrays numpy

假设我有两个numpy数组ab,我知道以下情况属实:

  • a.size == b.size
  • a.shape != b.shape
  • b.reshape(a.shape)b.ravel()将导致创建副本/中间件
  • a.reshape(b.shape)a.ravel()可能会导致创建副本/中间件
  • ab是巨大的(可能是4 + GiB)

如何将数据从b复制到a,同时重塑数据而不创建中间数?

以下是我尝试但由于某种原因无效的方法:

  1. a[:] = b - ValueError: could not broadcast input array ...
  2. np.copyto(a, b) - ValueError: could not broadcast input array ...
  3. a[:] = b.reshape(a.shape) - 创建中间
  4. np.copyto(a, b.reshape(a.shape)) - 创建中间
  5. np.place(a, np.ones(a.shape), b.ravel()) - 创建中间数并分配另一个数组
  6. np.put(a, np.arange(a.size), b) - 分配另一个数组,非常慢(比#4慢3.4倍)
  7. a[:] = b.flat - ValueError: could not broadcast input array ...
  8. a.flat = b.flat - 慢(比#4慢2.1倍)
  9. a.flat = b - slow-ish(比#4慢1.1倍)
  10. 我真正希望的是ndarray.reshape(...)有一个输出参数!从我对np.copyto(a, b.reshape(a.shape))的测试中,中间到a的连续副本需要1/3的时间,而重塑需要2/3的时间(非连续副本),这意味着副本应该只能使用2/3的时间,也不能使用任何额外的内存。

    展望Numpy的内容,有一个函数PyArray_AssignArray(由PyArray_NewCopy使用,PyArray_NewShape使用reshape内部使用的函数。但是,此函数未在Array API中记录,并且可能无法完全处理不同的形状,因为评论中的另一种方法称为“尚未实现”,称为PyArray_AssignArrayAsFlat

0 个答案:

没有答案