【问题标题】:Reshaping a numpy.array in Fortran-contiguous order以 Fortran 连续顺序重塑 numpy.array
【发布时间】:2013-08-30 04:43:51
【问题描述】:

我有一个如下的数组,

from numpy import *
a=array([1,2,3,4,5,6,7,8,9])

我想得到如下结果

[[1,4,7],[2,5,8],[3,6,9]]

因为我有一个大数组。所以我需要一种有效的方法来做到这一点。 而且最好就地重塑它。

【问题讨论】:

  • 如果您使用 fortran-order,请务必知道,您对 fortran-order 数组所做的几乎所有操作都会返回 C-order 的结果(甚至可能首先转换为 C-order,然后再使用它)但是知道你可以/想要加速它会很有趣

标签: python arrays numpy reshape


【解决方案1】:

您可以使用reshape 传递order='F'。只要有可能,返回的数组将只是原始数组的视图,不会复制数据,例如:

a = np.arange(1, 10)
# array([1, 2, 3, 4, 5, 6, 7, 8, 9])
b = a.reshape(3, 3)
c = a.reshape(3, 3, order='F')

a[0] = 11

print(b)
#array([[ 11,  4,  7],
#       [ 2,  5,  8],
#       [ 3,  6,  9]])

print(c)
#array([[ 11,  4,  7],
#       [ 2,  5,  8],
#       [ 3,  6,  9]])

flags 属性可用于检查数组的内存顺序和数据所有权:

print(a.flags)
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

print(b.flags)
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

print(c.flags)
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

【讨论】:

    【解决方案2】:

    您可以使用reshape 并将 order 参数更改为 FORTRAN (column-major) order:

     a.reshape((3,3),order='F')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 2015-01-31
      • 2021-01-08
      • 2015-02-14
      • 2016-08-26
      • 2016-09-23
      • 1970-01-01
      相关资源
      最近更新 更多