假设我有两个numpy数组a
和b
,我知道以下情况属实:
a.size == b.size
a.shape != b.shape
b.reshape(a.shape)
和b.ravel()
将导致创建副本/中间件a.reshape(b.shape)
和a.ravel()
可能会导致创建副本/中间件a
和b
是巨大的(可能是4 + GiB)如何将数据从b
复制到a
,同时重塑数据而不创建中间数?
以下是我尝试但由于某种原因无效的方法:
a[:] = b
- ValueError: could not broadcast input array ...
np.copyto(a, b)
- ValueError: could not broadcast input array ...
a[:] = b.reshape(a.shape)
- 创建中间np.copyto(a, b.reshape(a.shape))
- 创建中间np.place(a, np.ones(a.shape), b.ravel())
- 创建中间数并分配另一个数组np.put(a, np.arange(a.size), b)
- 分配另一个数组,非常慢(比#4慢3.4倍)a[:] = b.flat
- ValueError: could not broadcast input array ...
a.flat = b.flat
- 慢(比#4慢2.1倍)a.flat = b
- slow-ish(比#4慢1.1倍)我真正希望的是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
。