我无法理解如何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
.原因是因为我将读取以列主要顺序设置的多维数组的文件.
你的问题已得到解答,但我想我会加上这个来解释你的观察,"在这一点上,我不确定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
数据存储在列主要连续的位置.
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]])