Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 二维数据阵列的Numpy fromfile填充顺序是什么?_Python_Python 3.x_Numpy_Custom Data Type - Fatal编程技术网

Python 二维数据阵列的Numpy fromfile填充顺序是什么?

Python 二维数据阵列的Numpy fromfile填充顺序是什么?,python,python-3.x,numpy,custom-data-type,Python,Python 3.x,Numpy,Custom Data Type,我正在尝试使用numpy.fromfile函数读取结构化二进制文件。在本例中,我有一个numpy.dtype,用于定义要与np.fromfile一起使用的用户定义的数据类型。 我将在这里复制数据结构的相关部分,因为整个结构相当长: ('RawData', np.int32, (2, BlockSize)) 这将把BlockSize*2个Int32读入字段RawData,将生成一个2xBlockSize矩阵。这就是我遇到麻烦的地方,因为我想复制Matlab函数的行为,其中填充了矩阵。至于Nu

我正在尝试使用numpy.fromfile函数读取结构化二进制文件。在本例中,我有一个numpy.dtype,用于定义要与np.fromfile一起使用的用户定义的数据类型。 我将在这里复制数据结构的相关部分,因为整个结构相当长:

('RawData', np.int32, (2, BlockSize))  
这将把BlockSize*2个Int32读入字段RawData,将生成一个2xBlockSize矩阵。这就是我遇到麻烦的地方,因为我想复制Matlab函数的行为,其中填充了矩阵。至于NumPy的fromfile,我没有提到,至少我找不到

NumPy的fromfile应该像Matlab的fread一样工作,这并不重要,但我必须知道NumPy的fromfile如何相应地工作以编写代码


现在的问题是,当使用自定义数据类型时,NumPy fromfile函数中二维数组的填充顺序是什么?

默认情况下,创建新的二维数组时,NumPy将使用C顺序,即。这与Matlab使用的顺序相反

例如,如果BlockSize为4,而原始数据为

0 1 2 3 4 5 6 7
然后将使用2 x 4阵列

[[0, 1, 2, 3],
 [4, 5, 6, 7]]
使用Matlab和相同的原始数据,2 x 4阵列将

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

默认情况下,创建新的二维数组时,NumPy将使用C排序,即。这与Matlab使用的顺序相反

例如,如果BlockSize为4,而原始数据为

0 1 2 3 4 5 6 7
然后将使用2 x 4阵列

[[0, 1, 2, 3],
 [4, 5, 6, 7]]
使用Matlab和相同的原始数据,2 x 4阵列将

[[0, 2, 4, 6],
 [1, 3, 5, 7]]
fromfile和tofile读/写平面、1d、阵列:

In [204]: x = np.arange(1,11).astype('int32')                                                          
In [205]: x.tofile('data615')                                                                          
fromfile返回一个1d数组:

In [206]: np.fromfile('data615',np.int32)                                                              
Out[206]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10], dtype=int32)
x、 重塑2,5.tofile。。。会拯救同样的东西。tofile不保存数据类型或形状信息

重塑为2d,默认顺序为“C”:

In [207]: np.fromfile('data615',np.int32).reshape(2,5)                                                 
Out[207]: 
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]], dtype=int32)
但它可以更改为MATLAB,如:

In [208]: np.fromfile('data615',np.int32).reshape(2,5, order='F')                                      
Out[208]: 
array([[ 1,  3,  5,  7,  9],
       [ 2,  4,  6,  8, 10]], dtype=int32)
底层的databuffer是相同的,只是一个1d字节数组

编辑 该文件可以读取为2整数结构:

In [249]: np.fromfile('data615','i4,i4')                                                               
Out[249]: 
array([(1,  2), (3,  4), (5,  6), (7,  8), (9, 10)],
      dtype=[('f0', '<i4'), ('f1', '<i4')])
In [250]: _['f0']                                                                                      
Out[250]: array([1, 3, 5, 7, 9], dtype=int32)
如果数据已保存为浮点数,我们可以直接将其作为复杂数据加载:

In [255]: x.astype(np.float32).tofile('data615f')                                                      
In [257]: xx = np.fromfile('data615f',np.complex64)                                                    
In [258]: xx                                                                                           
Out[258]: array([1. +2.j, 3. +4.j, 5. +6.j, 7. +8.j, 9.+10.j], dtype=complex64)
从整数序列获取复数的另一种方法:

In [261]: np.fromfile('data615', np.int32).reshape(5,2)                                                
Out[261]: 
array([[ 1,  2],
       [ 3,  4],
       [ 5,  6],
       [ 7,  8],
       [ 9, 10]], dtype=int32)
In [262]: xx = np.fromfile('data615', np.int32).reshape(5,2)                                           
In [263]: xx[:,0]+1j*xx[:,1]                                                                           
Out[263]: array([1. +2.j, 3. +4.j, 5. +6.j, 7. +8.j, 9.+10.j])
fromfile和tofile读/写平面、1d、阵列:

In [204]: x = np.arange(1,11).astype('int32')                                                          
In [205]: x.tofile('data615')                                                                          
fromfile返回一个1d数组:

In [206]: np.fromfile('data615',np.int32)                                                              
Out[206]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10], dtype=int32)
x、 重塑2,5.tofile。。。会拯救同样的东西。tofile不保存数据类型或形状信息

重塑为2d,默认顺序为“C”:

In [207]: np.fromfile('data615',np.int32).reshape(2,5)                                                 
Out[207]: 
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]], dtype=int32)
但它可以更改为MATLAB,如:

In [208]: np.fromfile('data615',np.int32).reshape(2,5, order='F')                                      
Out[208]: 
array([[ 1,  3,  5,  7,  9],
       [ 2,  4,  6,  8, 10]], dtype=int32)
底层的databuffer是相同的,只是一个1d字节数组

编辑 该文件可以读取为2整数结构:

In [249]: np.fromfile('data615','i4,i4')                                                               
Out[249]: 
array([(1,  2), (3,  4), (5,  6), (7,  8), (9, 10)],
      dtype=[('f0', '<i4'), ('f1', '<i4')])
In [250]: _['f0']                                                                                      
Out[250]: array([1, 3, 5, 7, 9], dtype=int32)
如果数据已保存为浮点数,我们可以直接将其作为复杂数据加载:

In [255]: x.astype(np.float32).tofile('data615f')                                                      
In [257]: xx = np.fromfile('data615f',np.complex64)                                                    
In [258]: xx                                                                                           
Out[258]: array([1. +2.j, 3. +4.j, 5. +6.j, 7. +8.j, 9.+10.j], dtype=complex64)
从整数序列获取复数的另一种方法:

In [261]: np.fromfile('data615', np.int32).reshape(5,2)                                                
Out[261]: 
array([[ 1,  2],
       [ 3,  4],
       [ 5,  6],
       [ 7,  8],
       [ 9, 10]], dtype=int32)
In [262]: xx = np.fromfile('data615', np.int32).reshape(5,2)                                           
In [263]: xx[:,0]+1j*xx[:,1]                                                                           
Out[263]: array([1. +2.j, 3. +4.j, 5. +6.j, 7. +8.j, 9.+10.j])

我见过使用整形函数指定顺序,是否可以使用fromfile函数指定顺序?我见过使用整形函数指定顺序,是否可以使用fromfile函数指定顺序?因此,你的意思是,我应该把数据作为一维数组读取,然后在可以指定所需顺序的地方对其进行重塑,对吗?我以前没想过。我假设原始数据只是一个4字节整数的平面序列。加载过程中或加载后,施加2d或其他块体结构。除了按1d顺序读取数字外,我们还可以按2人一组读取数字。查看我的编辑。这是一个存储在二进制文件中的复数序列,每对都是复数a+ib。我已经做的是将整个块作为1d数组读取,并选择从0开始的每一个元素作为复数的实部,其余元素作为虚部,要像这样构造复杂的一维数组:cmplx=RawData[0::2]+1j*RawData[1::2]。现在,我想你编辑的部分会好得多,我来看看它是如何工作的。我为复杂的值添加了一些想法。谢谢,伙计。是否可以在从文件读取的结构化数组中保留一些空间,以便以后添加数据。我需要对这些复杂的数据进行一些处理,并希望将其添加回结构化数组以保持程序整洁,否则我必须有一个单独的列表来存储这些数据,或者将其附加到我已有的结构化数组中。由于附加到numpy数组是没有效率的,所以我试图避免这种情况。你有什么建议吗?那么,你的建议是,我应该将数据读取为一维数组,然后在可以指定所需顺序的地方对其进行重塑,对吗?我以前没想过。我假设原始数据只是一个4字节整数的平面序列。加载过程中或加载后,施加2d或其他块体结构。除了按1d顺序读取数字外,我们还可以按2人一组读取数字。请参阅我的编辑。这是一个存储在二进制文件中的复数序列,每对都是复数a+ib。我已经做的是将整个块作为1d数组读取,并选择从0开始的每一个元素作为复数的实部,a
将其余部分作为虚部,构造一个复杂的一维数组,如下所示:cmplx=RawData[0::2]+1j*RawData[1::2]。现在,我想你编辑的部分会好得多,我来看看它是如何工作的。我为复杂的值添加了一些想法。谢谢,伙计。是否可以在从文件读取的结构化数组中保留一些空间,以便以后添加数据。我需要对这些复杂的数据进行一些处理,并希望将其添加回结构化数组以保持程序整洁,否则我必须有一个单独的列表来存储这些数据,或者将其附加到我已有的结构化数组中。由于附加到numpy数组是没有效率的,所以我试图避免这种情况。你有什么建议吗?