python - 将 numpy 数组转换为 C 连续顺序的最便宜方法?

标签 python arrays numpy

以下生成一个 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/

相关文章:

python - Pandas - 删除索引列

java - 为什么可以新建一个接口(interface)数组

python - 如何将pygame中的3d数组转换为opencv python中的有效输入?

python - 如何通过类层次结构聚合字典 (Python)

python - discord.py 机器人重写 AttributeError : 'Bot' object has no attribute 'send_message'

PHP不重复随机值

python - Pandas 计算具有列表而不是单个值的列的平均值

python - 比较两个不同大小的数组 - python numpy

python - QCalendar 示例中的全名月份格式

c++ - 数组大小未定义? C++