如何使用类似于matlab的python结构数组

时间:2017-11-14 04:01:06

标签: arrays python-2.7 list pandas numpy

早上好    我已经彻底环顾四周尝试找出一种方法来创建一个    matlab就像python中的struct数组一样。我的输入.csv文件是标题少

我的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中实现相同的逻辑和结构。

谢谢

2 个答案:

答案 0 :(得分:1)

在Octave:

spark-submit --class com.my.class.with.main.Foo \
    s3://mybucket/script.jar \
    "s3://partitioned-input-data/*/*/*/*/*.txt" \
    "s3://output-bucket/table-name"
制造

>> 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 加载numpy

scipy.io.loadmat

或使用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,) 已翻译成带有2个字段的结构化数组,对应于struct字段(是MATLAB名称吗?)

struct

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) 是一个数组(对象dtype)。 A也是对象dtype,但包含数组。这就是B处理MATLAB单元格的方式。

MATLAB struct也可以实现为具有属性loadmatA的自定义类,或者作为包含这些键的字典。

我知道Bnumpy更好,但我们尝试将此数组放入数据框中:

pandas

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

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

我可以把它们打包成一个结构更好的dtype:

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.]])

答案 1 :(得分:0)

使用整数位置访问数据框时,需要使用df.iloc [int]。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iloc.html

例如,如果要访问第一行和第一列中的实例,则需要查看df.iloc [0,0]。