如何在原地转置numpy的ndarray?

5
我正在使用numpy。
我有一个形状为[T,H,W,C]的ndarray,并希望将其转置为:[T,C,H,W]。然而,这个数组非常大,我希望能够节省内存。
但是我发现只有np.transpose可以做到这一点,它不是原地操作。
为什么像np.transpose这样的操作没有原地操作?
我曾经认为任何命名为np.Bar的操作都会有其原地操作的对应项,但事实并非如此。
1个回答

7

来自np.transpose文档

尽可能返回视图。

这意味着为输出数组不会分配额外的内存。

>>> import numpy as np

>>> A = np.random.rand(2, 3, 4, 5)
>>> B = np.transpose(A, axes=(0, 3, 1, 2))

>>> A.shape
(2, 3, 4, 5)
>>> B.shape
(2, 5, 3, 4)

你可以使用np.shares_memory来检查B是否是A的视图:
>>> np.shares_memory(A, B)
True

所以,您可以使用np.transpose安全地转置您的数据。

2
这个想法是为了证明转置操作所意图执行的类型确实返回一个视图而不是副本。 - taras
1
@游凯超,如果np.transpose(A,axes=xxx)是一个视图,则A只是被重新分配(两者都指向相同的数据结构)。 - taras
1
如果我们想要真正的转置而不是一个视图,是否有任何解决方案? - Jingpeng Wu
@JingpengWu,一个快速而不太规范的方法是复制数组,然后转置副本。 - taras
@JingpengWu https://github.com/seung-lab/fastremap 版本号1.2.0适用于你的需求。^_^ 它可以就地转换2d、3d和4d数组。 - SapphireSun
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接