以下生成一个 C 连续的 numpy 数组:
import numpy
a = numpy.ones((1024,1024,5))
现在,如果我将其切片,结果可能不再相同。例如:
bn = a[:, :, n]
n
从 0 到 4。
我的问题是我需要 bn
是 C 连续的,并且我需要对 a 的许多实例执行此操作。我只需要每个 bn
一次,并且想避免做
bn = bn.copy(order='C')
我也不想这样重写我的代码
a = numpy.ones((5,1024,1024))
有没有比复制更快、更便宜的方法来获取 bn
?
背景:
我想散列每个 a
的每个切片,使用
import hashlib
hashlib.sha1(a[:, :, n]).hexdigest()
不幸的是,这将抛出一个 ValueError
,提示订单。因此,如果有另一种快速获取我想要的哈希值的方法,我也会使用它。
最佳答案
这是将 numpy 与 C 接口(interface)时的标准操作。 看看numpy.ascontiguousarray
x=numpy.ascontiguousarray(x)
是处理它的正确方法。
使用numpy.asfortranarray如果您需要 Fortran 命令。
如前所述,该函数将在必要时进行复制。所以没有办法解决它。你可以试试rollaxis在您的操作之前,短轴是第一轴。这使您可以查看数组
In [2]: A=np.random.rand(1024,1024,5)
In [3]: B=np.rollaxis(A,2)
In [4]: B.shape
Out[4]: (5, 1024, 1024)
In [5]: B.flags
Out[5]:
C_CONTIGUOUS : False
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
In [6]: A.flags
Out[6]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
所以rollaxis也没有解决这个问题。
关于python - 将 numpy 数组转换为 C 连续顺序的最便宜方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29947639/