我正在用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)
似乎是在重新排序内存)。在
a.T
与a.transpose()
一样,只影响头视图和返回视图。 你可以用:a.T.flags.owndata
来检查,它是False
。在要真正转置数据,最简单的复制方法是:
a=a.T.copy()
。在使之到位是一项艰巨的任务。你可以这样做:
输出:
^{pr2}$但没有担保,因为你写的是你读的数据。在大型阵列上,它可能会在没有警告的情况下失败。在
相关问题 更多 >
编程相关推荐