numpy数组行主要和列专业

 Cucci419_631 发布于 2023-02-13 12:28

我无法理解如何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列major(F_CONTIGUOUS)因此在内部a应如下所示:

[1, 4, 2, 5, 3, 6]

这正是本词汇表中所述的内容.令我困惑的是,如果我尝试以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.原因是因为我将读取以列主要顺序设置的多维数组的文件.

2 个回答
  • 你的问题已得到解答,但我想我会加上这个来解释你的观察,"在这一点上,我不确定F_CONTIGUOUS国旗告诉我们什么,因为它不遵守命令."


    item方法不会像您认为的那样直接访问数据.为此,您应该访问该data属性,该属性为您提供字节字符串.

    一个例子:

    c = np.array([[1,2,3],
                  [4,6,7]], order='C')
    
    f = np.array([[1,2,3],
                  [4,6,7]], order='F')
    

    print c.flags.c_contiguous, f.flags.f_contiguous
    # True, True
    

    print c.nbytes == len(c.data)
    # True
    

    现在让我们打印两者的连续数据:

    nelements = np.prod(c.shape)
    bsize = c.dtype.itemsize # should be 8 bytes for 'int64'
    for i in range(nelements):
        bnum = c.data[i*bsize : (i+1)*bsize] # The element as a byte string.
        print np.fromstring(bnum, dtype=c.dtype)[0], # Convert to number.
    

    这打印:

    1 2 3 4 6 7
    

    这是我们所期望的,因为它c是订单'C',即它的数据存储在行主要连续.

    另一方面,

    nelements = np.prod(f.shape)
    bsize = f.dtype.itemsize # should be 8 bytes for 'int64'
    for i in range(nelements):
        bnum = f.data[i*bsize : (i+1)*bsize] # The element as a byte string.
        print np.fromstring(bnum, dtype=f.dtype)[0], # Convert to number.
    

    版画

    1 4 2 6 3 7
    

    这也是我们期望看到的,因为f数据存储在列主要连续的位置.

    2023-02-13 12:32 回答
  • 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]])
    

    2023-02-13 12:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有