2013-11-17 4 views
0

Я очень хорошо знаком с MATLAB, но у меня проблемы с изучением Python.Проблемы с матрицами NumPy

Проблема заключается в создании массива X (idx, :), где я увеличиваю idx с каждой прочитанной строкой и присваиваю X (idx, :) строке данных. Ниже приводятся данные и примерная программа Python для меня.

Файл: "sample_data"

TRE-G3T- Triumph-  0.000 10/01/2013 227001.30 1760.00000 10/01/2013 227016.30 41 31 27.35998 -70 40 19.00843  -28.130  0.707 882922.244 2652775.212  -65.517  -24.677  -13.470  0.020  0.022  0.041  0.051  -13.469  -0.771 0.0109 2 1.80 7  0.005 S    0.032 -0.024  0.001 -0.256 -0.162 0.554 
TRE-G3T- Triumph-  0.000 10/01/2013 227001.40 1760.00000 10/01/2013 227016.40 41 31 27.35993 -70 40 19.00854  -28.123  0.714 882922.235 2652775.207  -65.519  -24.679  -13.464  0.020  0.022  0.041  0.051  -13.463  -0.650 0.0136 2 1.80 7  0.006 S    0.005 -0.039  0.057 0.066 0.301 -0.602 
TRE-G3T- Triumph-  0.000 10/01/2013 227001.50 1760.00000 10/01/2013 227016.50 41 31 27.35997 -70 40 19.00848  -28.128  0.710 882922.240 2652775.211  -65.518  -24.678  -13.468  0.020  0.022  0.041  0.051  -13.467  -0.631 0.0103 2 1.80 7  0.007 S    0.012 -0.011 -0.005 0.006 -0.094 0.606 
TRE-G3T- Triumph-  0.000 10/01/2013 227001.60 1760.00000 10/01/2013 227016.60 41 31 27.36002 -70 40 19.00858  -28.122  0.715 882922.232 2652775.216  -65.520  -24.676  -13.462  0.020  0.022  0.041  0.051  -13.462  -0.829 0.0109 2 1.80 7  0.007 S    0.014 -0.021  0.056 -0.021 0.214 -0.435 
TRE-G3T- Triumph-  0.000 10/01/2013 227001.70 1760.00000 10/01/2013 227016.70 41 31 27.36005 -70 40 19.00849  -28.125  0.712 882922.239 2652775.219  -65.518  -24.675  -13.465  0.020  0.022  0.041  0.051  -13.465  -1.040 0.0106 2 1.80 7  0.006 S    0.011  0.000  0.011 0.110 0.264 -0.284 

программа Python:

#!/usr/local/bin/python 


import numpy as np 
import matplotlib.pyplot as plt 


def dms2deg(deg,min,sec): 
# jad - 20131103 
     sgn = float(deg)/abs(float(deg)) 
     return sgn * (abs(float(deg)) + (float(min) + (float(sec)/60))/60) 


def decdeg2dms(dd): 
# http://stackoverflow.com/questions/2579535/how-to-convert-dd-to-dms-in-python 
    is_positive = dd >= 0 
    dd = abs(dd) 
    minutes,seconds = divmod(dd*3600,60) 
    degrees,minutes = divmod(minutes,60) 
    degrees = degrees if is_positive else -degrees 
    return (degrees,minutes,seconds) 





# indices into GrafNav output record 
idx0 = 7 # index of GPS seconds 
idx1 = 8 # beginning index for lat/lon 
idx2 = 28 # solution quality 

f = open('sample_data','r') 


ctr2 = -1 

X=[] 
X=np.array(X) 



for line in f: 

    var = line.split() 
    l=len(var) 

    if l > 35:     # data has more than 35 columns 
     GPS_sec = var[idx0] 

     lat_deg = var[idx1+0] 
     lat_min = var[idx1+1] 
     lat_sec = var[idx1+2] 

     lon_deg = var[idx1+3] 
     lon_min = var[idx1+4] 
     lon_sec = var[idx1+5] 

     h_ell = var[idx1+6] 

     latd = dms2deg(lat_deg,lat_min,lat_sec) 
     lond = dms2deg(lon_deg,lon_min,lon_sec) 


     Q = var[idx2] 
     stdev = var[idx2-4] 
     h_sep = var[idx2-2] 
     amb_drift = var[idx2-1] 
     nsat = var[idx2+2] 

     ctr2 += 1 
      X=np.array([float(GPS_sec),float(latd),float(lond),float(h_ell),int(Q),int(nsat),float(stdev),float(h_sep),float(amb_drift)]) 
     print GPS_sec, latd, lond, h_ell, Q, nsat, stdev, h_sep, amb_drift 

f.close() 
+0

Что именно вы пытаетесь сделать ... вернуть списки, которые эквивалентны полным столбцам, которые вы хотите, или возвращать каждую строку, состоящую только из трех столбцов? –

ответ

1

Вы получите намного лучшие ответы, если вы можете сосредоточиться на ваш вопрос о том, что вы действительно просят. В вашем коде есть много вещей, которые не имеют отношения к вопросу, который трудно копать, но чтобы добраться до настоящего мяса. Я думаю, что вы хотите что-то вроде этого:

X = [] 
for line in f: 
    .... 
    row = np.array([GPS_sec, latd, lond, h_ell, Q, nsat, stdev, h_sep, amb_drift], 
        dtype=float) 
    X.append(row) 

X = np.array(X) 

Что это делает держать строки окончательного массива в списке, а затем преобразовать его в массив после цикла. Также вы должны знать, что ndarrays может иметь только один тип dtype, я считаю, что это то же самое, что и matlab, поэтому неясно, чего вы пытаетесь сделать, выполнив np.array([float(a), int(b)]). Надеюсь это поможет.

+0

Спасибо за ваши ответы и комментарии о том, как лучше размещать сообщения. Я новичок на этом сайте, поэтому, пожалуйста, простите любые trnasgressions. В основном то, что я пытаюсь сделать, можно сделать в MATLAB, например, – user2817154

+0

Я тоже пришел из Matlab, поэтому знаю, что некоторые вещи в python/numpy отличаются и/или неинтуитивными. Этот сайт (http://wiki.scipy.org/NumPy_for_Matlab_Users) мне очень помог, возможно, вы его уже видели. Кроме того, [SSCCE] (http://sscce.org/) является ужасным акронимом, но он дает хорошие вопросы (и четкие ответы). –

+0

Я пытаюсь создать двумерную матрицу, которая может быть выполнена в MATLAB , например x (1, :) = [1,2,3,4]; x (2, :) = [5,6,7,8]; ... ... И после этого сделайте различные участки, e.г участок (х (:, 1), х (:, 3)) или участок (х (:, 1), х (: 4)) я полностью сбивает с толку синтаксис в PYTHON, от получения данных в матрицу для правильной нарезки, чтобы сделать график. jim – user2817154

1

Возможно, вы хотите просто преобразовать свои текстовые данные в numpyarray. Как отметил @BiRico, у вас не может быть более одного типа данных dtype в одном array, если вы должны это сделать, вам нужно использовать strutured array, или еще лучше, pandas dataframe.

Также numpy имеет встроенные функции ввода-вывода genfromtxt(), что довольно быстро. Используйте его вместо жесткого кода одного:

>>> dtypeLS=[('Var0', 'S10'), 
    ('Var1', 'S10'),  
    ('Var2', 'f8'),  
    ('Var3', '<M8[D]'), 
    ('Var4', 'f8'),  
    ('Var5', 'f8'),  
    ('Var6', '<M8[D]'), 
    ('Var7', 'f8'),  
    ('Var8', 'f8'),  
    ('Var9', 'f8'),  
    ('Var10', 'f8'),  
    ('Var11', 'f8'),  
    ('Var12', 'f8'),  
    ('Var13', 'f8'),  
    ('Var14', 'f8'),  
    ('Var15', 'f8'),  
    ('Var16', 'f8'),  
    ('Var17', 'f8'),  
    ('Var18', 'f8'),  
    ('Var19', 'f8'),  
    ('Var20', 'f8'),  
    ('Var21', 'f8'),  
    ('Var22', 'f8'),  
    ('Var23', 'f8'),  
    ('Var24', 'f8'),  
    ('Var25', 'f8'),  
    ('Var26', 'f8'),  
    ('Var27', 'f8'),  
    ('Var28', 'f8'),  
    ('Var29', 'f8'),  
    ('Var30', 'f8'),  
    ('Var31', 'f8'),  
    ('Var32', 'S10'),  
    ('Var33', 'f8'),  
    ('Var34', 'f8'),  
    ('Var35', 'f8'),  
    ('Var36', 'f8'),  
    ('Var37', 'f8'),  
    ('Var38', 'f8')] 
>>> a=genfromtxt('temp.txt', dtype=dtypeLS) 
>>> a[0] 
('TRE-G3T-', 'Triumph-', 0.0, datetime.date(2013, 10, 1), 227001.3, 1760.0, datetime.date(2013, 10, 1), 227016.3, 41.0, 31.0, 27.35998, -70.0, 40.0, 19.00843, -28.13, 0.707, 882922.244, 2652775.212, -65.517, -24.677, -13.47, 0.02, 0.022, 0.041, 0.051, -13.469, -0.771, 0.0109, 2.0, 1.8, 7.0, 0.005, 'S', 0.032, -0.024, 0.001, -0.256, -0.162, 0.554) 
>>> a['Var11'] 
array([-70., -70., -70., -70., -70.]) 
>>> a['Var12'] 
array([ 40., 40., 40., 40., 40.]) 
>>> a['Var13'] 
array([ 19.00843, 19.00854, 19.00848, 19.00858, 19.00849]) 
>>> np.sign(a['Var11'])*(np.abs(a['Var11'])+a['Var12']/60+a['Var13']/3600) 
array([-70.67194679, -70.67194682, -70.6719468 , -70.67194683, -70.6719468 ])  

Наконец, так же, как и в Matlab, всегда векторизации, если вы хотите вещи, чтобы быстро бегать. См. Код преобразования dd-to-dms в последней строке.

Кроме того, я должен изменить свой формат день из 10-01-2013 в 2013-10-01 использовать datetimedtype.

Смежные вопросы