jml*_*pez 12 python arrays numpy
我无法理解如何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
Run Code Online (Sandbox Code Playgroud)
这表示a列major(F_CONTIGUOUS)因此在内部a应如下所示:
[1, 4, 2, 5, 3, 6]
Run Code Online (Sandbox Code Playgroud)
这正是本词汇表中所述的内容.令我困惑的是,如果我尝试以a线性方式访问数据而不是我得到:
>>> for i in xrange(6): print a.item(i)
...
1.0
2.0
3.0
4.0
5.0
6.0
Run Code Online (Sandbox Code Playgroud)
在这一点上,我不确定F_CONTIGUOUS旗帜告诉我们什么,因为它不尊重订购.显然python中的所有内容都是行主要的,当我们想以线性方式迭代时,我们可以使用迭代器flat.
问题如下:假设我们有一个数字列表,比如说:1, 2, 3, 4, 5, 6,我们如何在列主要顺序中创建一个numpy形状数组(2, 3)?那我怎么能得到一个看起来像这样的矩阵
array([[ 1., 3., 5.],
[ 2., 4., 6.]])
Run Code Online (Sandbox Code Playgroud)
我真的希望能够在列表上线性迭代并将它们放入新创建的列表中ndarray.原因是因为我将读取以列主要顺序设置的多维数组的文件.
Kil*_*ole 17
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]])
Run Code Online (Sandbox Code Playgroud)
如果更改形状,则数据顺序不会更改.
如果你添加'F',你可以得到你想要的.
>>> b
array([1, 2, 3, 4, 5, 6])
>>> c = b.reshape(2,3,order='F')
>>> c
array([[1, 3, 5],
[2, 4, 6]])
Run Code Online (Sandbox Code Playgroud)
你的问题已得到解答,但我想我会加上这个来解释你的观察,"在这一点上,我不确定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')
Run Code Online (Sandbox Code Playgroud)
守
print c.flags.c_contiguous, f.flags.f_contiguous
# True, True
Run Code Online (Sandbox Code Playgroud)
和
print c.nbytes == len(c.data)
# True
Run Code Online (Sandbox Code Playgroud)
现在让我们打印两者的连续数据:
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.
Run Code Online (Sandbox Code Playgroud)
这打印:
1 2 3 4 6 7
Run Code Online (Sandbox Code Playgroud)
这是我们所期望的,因为它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.
Run Code Online (Sandbox Code Playgroud)
版画
1 4 2 6 3 7
Run Code Online (Sandbox Code Playgroud)
这也是我们期望看到的,因为f数据存储在列主要连续的位置.
想在评论中添加这个,但我的代表太低了:
虽然 Kill Console 的回答给出了 OP 所需的解决方案,但我认为重要的是要注意 numpy.reshape() 文档 ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape) 中所述。 html ):
请注意,无法保证返回数组的内存布局(C 或 Fortran 连续)。
因此,即使视图是按列显示的,数据本身也可能不是,这可能会导致计算效率低下,而这可能会受益于数据按列存储在内存中。也许:
a = np.array(np.array([1, 2, 3, 4, 5, 6]).reshape(2,3,order='F'), order='F')
Run Code Online (Sandbox Code Playgroud)
提供了更多的数据按列存储的保证(请参阅https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.array.html 上的订单参数说明)。