6

我有一个像下面这样的数组,

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

我想得到如下结果

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

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

4

2 回答 2

8

您可以使用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
于 2013-08-27T12:44:22.453 回答
5

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

 a.reshape((3,3),order='F')
于 2013-08-27T12:36:25.190 回答