如何使用类似于Matlab的python结构数组 [英] How to use python structure array similar to matlab

查看:220
本文介绍了如何使用类似于Matlab的python结构数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

早上好 我彻底环顾四周,尝试找出一种方法来创建 Matlab像python中的struct数组.我的输入.csv文件少了标题

Good morning I have thoroughly looked around to try figuring out a way to create a matlab like struct array in python. My input .csv file is header less

我的matlab代码

  dumpdata = csvread('dumpdata.csv'); 
  N_dumpdata_samples = length(dumpdata);  

  rec_sample_1second = struct('UTC_time',{},'sv_id_set',{},'pseudorange',
  {},'state',{});

  for s=1:1:N_dumpdata_samples

    rec_sample_1second(s).UTC_time = dumpdata(s,1);
   rec_sample_1second(s).UTC_time = round(rec_sample_1second(s).
   UTC_time * 10);
   rec_sample_1second(s).UTC_time = rec_sample_1second(s).
   UTC_time / 10;               

   for t=1:1:15

       rec_sample_1second(s).sv_id_set(t) = dumpdata(s,t+1);           
       rec_sample_1second(s).pseudorange(t) = dumpdata(s,t+16);       
       rec_sample_1second(s).state(t) = dumpdata(s,t+31);             
       end;
    end;

尝试在python中实现

   import numpy as np
   import pandas as pd

   df = pd.read_csv('path'/Dumpdata.csv',header=None)
   N_dumpdata_samples=len(df)
   structure={}
   structure["parent1"] = {}
  UTC_time=[]
  for s in range(N_dumpdata_samples):
      # structure['parent1']['UTC_time']=df[s,0] -> this line give error
      UTC_time=df['s',0]
  .......

我的问题是:如何在python中实现相同的逻辑和结构.

My question is : How can I implement same logic and structure in python.

谢谢

推荐答案

在八度中:

>> data = struct('A',{}, 'B', {});
>> for s=1:1;5
       data(s).A = s
       for t=1:1:3
           data(s).B(t) = s+t
       end;
   end;

生产

>> data.A
ans =  1
ans =  2
ans =  3
ans =  4
ans =  5
>> data.B
ans =
   2   3   4
ans =
   3   4   5
ans =
   4   5   6
ans =
   5   6   7
ans =
   6   7   8
>> save -7 stack47277436.mat data

使用scipy.io.loadmat将其加载到numpy中:

In [17]: res = loadmat('stack47277436.mat')
In [18]: res
Out[18]: 
{'__globals__': [],
 '__header__': b'MATLAB 5.0 MAT-file, written by Octave 4.0.0, 2017-11-14 04:48:21 UTC',
 '__version__': '1.0',
 'data': array([[(array([[ 1.]]), array([[ 2.,  3.,  4.]])),
         (array([[ 2.]]), array([[ 3.,  4.,  5.]])),
         (array([[ 3.]]), array([[ 4.,  5.,  6.]])),
         (array([[ 4.]]), array([[ 5.,  6.,  7.]])),
         (array([[ 5.]]), array([[ 6.,  7.,  8.]]))]],
       dtype=[('A', 'O'), ('B', 'O')])}

或加载squeeze_me以删除奇异尺寸

In [22]: res = loadmat('stack47277436.mat',squeeze_me=True)
In [24]: res['data']
Out[24]: 
array([(1.0, array([ 2.,  3.,  4.])), (2.0, array([ 3.,  4.,  5.])),
       (3.0, array([ 4.,  5.,  6.])), (4.0, array([ 5.,  6.,  7.])),
       (5.0, array([ 6.,  7.,  8.]))],
      dtype=[('A', 'O'), ('B', 'O')])
In [25]: _.shape
Out[25]: (5,)

struct已被转换为具有2个字段的结构化数组,对应于struct字段(这是MATLAB名称吗?)

The struct has been translated into a structured array with 2 fields, corresponding to the struct fields (is that the MATLAB name?)

In [26]: res['data']['A']
Out[26]: array([1.0, 2.0, 3.0, 4.0, 5.0], dtype=object)
In [27]: res['data']['B']
Out[27]: 
array([array([ 2.,  3.,  4.]), array([ 3.,  4.,  5.]),
       array([ 4.,  5.,  6.]), array([ 5.,  6.,  7.]),
       array([ 6.,  7.,  8.])], dtype=object)

A是一个数组(对象dtype). B也是对象dtype,但包含数组.这就是loadmat处理MATLAB单元的方式.

A is an array (object dtype). B is also object dtype, but contains arrays. That's how loadmat handles MATLAB cells.

MATLAB结构也可以实现为具有属性AB的自定义类,或者实现为具有这些键的字典.

MATLAB struct could also be implemented as custom class with attributes A and B, or as a dictionary with those keys.

我比pandas更了解numpy,但让我们尝试将此数组放入数据框:

I know numpy better than pandas, but lets try to put this array into a dataframe:

In [28]: import pandas as pd
In [29]: df = pd.DataFrame(res['data'])
In [30]: df
Out[30]: 
   A                B
0  1  [2.0, 3.0, 4.0]
1  2  [3.0, 4.0, 5.0]
2  3  [4.0, 5.0, 6.0]
3  4  [5.0, 6.0, 7.0]
4  5  [6.0, 7.0, 8.0]
In [31]: df.dtypes
Out[31]: 
A    object
B    object
dtype: object


numpy中,可以清除字段并将其分配给变量:


In numpy the fields could be cleaned up and assigned to variables:

In [37]: A = res['data']['A'].astype(int)
In [38]: B = np.stack(res['data']['B'])
In [39]: A
Out[39]: array([1, 2, 3, 4, 5])
In [40]: B
Out[40]: 
array([[ 2.,  3.,  4.],
       [ 3.,  4.,  5.],
       [ 4.,  5.,  6.],
       [ 5.,  6.,  7.],
       [ 6.,  7.,  8.]])

一个是(5,)形状数组,另一个是(5,3).

One is a (5,) shape array, the other (5,3).

我可以将它们打包回到具有更漂亮dtype的结构化数组中:

I could pack those back into a structured array with a prettier dtype:

In [48]: C = np.empty((5,), [('A',int), ('B', int, (3,))])
In [49]: C['A'] = A
In [50]: C['B'] = B
In [51]: C
Out[51]: 
array([(1, [2, 3, 4]), (2, [3, 4, 5]), (3, [4, 5, 6]), (4, [5, 6, 7]),
       (5, [6, 7, 8])],
      dtype=[('A', '<i4'), ('B', '<i4', (3,))])

这篇关于如何使用类似于Matlab的python结构数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆