强制numpy数组的内存内转置

2024-09-28 22:11:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python连接一个C库。我使用数组的ctypes属性将数组传递给库。在

在某些情况下,我需要向C库提供一个数组,它应该是我的numpy数组a的转置。(另一种说法是C库不接受最内部维度的跨步)。但是,当我传递a.T而不是a时,什么都不会发生。在

事实上,纽比似乎只是简单地交换步幅来做某种懒惰的换位:

import ctypes
import numpy as np
a = np.zeros((2, 3))
a.ctypes.strides_as(ctypes.c_longlong)[:]
# returns [24, 8]
a.T.ctypes.strides_as(ctypes.c_longlong)[:]
# return [8, 24]

我的问题是,如何使这种转换发生在记忆中?在

编辑

我注意到了

^{pr2}$

重新排列记忆就像我想要的,但是如果有一个更优雅和明确的解决方案,我还是想听听。在

(有趣的是

a.T + np.zeros_like(a.T)

似乎是在重新排序内存)。在


Tags: 记忆importnumpyreturn属性asnpzeros
1条回答
网友
1楼 · 发布于 2024-09-28 22:11:46

a.Ta.transpose()一样,只影响头视图和返回视图。 你可以用:a.T.flags.owndata来检查,它是False。在

要真正转置数据,最简单的复制方法是:a=a.T.copy()。在

使之到位是一项艰巨的任务。你可以这样做:

a=np.arange(6).reshape(2,3).copy()
print(a,a.flags,id(a),sep='\n')

a.ravel()[:]=a.T.ravel()
a.shape=a.T.shape

print(a,a.flags,id(a),sep=('\n'))

输出:

^{pr2}$

但没有担保,因为你写的是你读的数据。在大型阵列上,它可能会在没有警告的情况下失败。在

相关问题 更多 >