我在了解numpy如何存储其数据时遇到了麻烦。考虑以下:

>>> import numpy as np
>>> a = np.ndarray(shape=(2,3), order='F')
>>> for i in xrange(6): a.itemset(i, i+1)
...
>>> a
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
>>> a.flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

这表示a是列主(F_CONTIGUOUS),因此在内部,a应该类似于以下内容:
[1, 4, 2, 5, 3, 6]

这就是glossary中所说的内容。令我困惑的是,如果我尝试以线性方式访问a的数据,则会得到:
>>> for i in xrange(6): print a.item(i)
...
1.0
2.0
3.0
4.0
5.0
6.0

在这一点上,我不确定F_CONTIGUOUS标志告诉我们什么,因为它不遵守该顺序。显然,python中的所有内容都是行专业的,当我们想以线性方式进行迭代时,可以使用迭代器 flat

问题如下:假定我们有一个数字列表,例如:1, 2, 3, 4, 5, 6,我们如何才能按列主要顺序创建形状为numpy(2, 3)数组?那就是我如何得到一个看起来像这样的矩阵
array([[ 1.,  3.,  5.],
       [ 2.,  4.,  6.]])

我真的很希望能够在列表上进行线性迭代,并将它们放入新创建的ndarray中。这样做的原因是因为我将读取按列主要顺序设置的多维数组文件。

最佳答案

numpy按行主要顺序存储数据。

>>> a = np.array([[1,2,3,4], [5,6,7,8]])
>>> a.shape
(2, 4)
>>> a.shape = 4,2
>>> a
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])

如果更改形状,则数据顺序不会更改。

如果添加“F”,则可以得到所需的内容。
>>> b
array([1, 2, 3, 4, 5, 6])
>>> c = b.reshape(2,3,order='F')
>>> c
array([[1, 3, 5],
       [2, 4, 6]])

关于python - numpy数组行专业和列专业,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20341614/

10-12 14:28