Python 关于NumPy矩阵有问题吗

Python 关于NumPy矩阵有问题吗,python,numpy,indexing,Python,Numpy,Indexing,我非常熟悉MATLAB,但是我在学习Python时遇到了困难 问题是创建一个数组X(idx,:),其中我用读取的每一行递增idx,并将X(idx,:)分配给一行数据。下面是我所掌握的数据和一个示例Python程序 文件:“样本数据” Python程序: #!/usr/local/bin/python import numpy as np import matplotlib.pyplot as plt def dms2deg(deg,min,sec): # jad - 20131103

我非常熟悉MATLAB,但是我在学习Python时遇到了困难

问题是创建一个数组X(idx,:),其中我用读取的每一行递增idx,并将X(idx,:)分配给一行数据。下面是我所掌握的数据和一个示例Python程序

文件:“样本数据”

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()

如果你能把问题集中在你真正想问的问题上,你会得到更好的答案。你的代码中有很多与问题无关的东西,但要想真正了解这些东西,很难去挖掘。我想你想要这样的东西:

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)

这样做的目的是将最终数组的行保存在列表中,然后在循环后将其转换为数组。另外,您应该知道Ndarray只能有一个数据类型,我相信这与matlab是一样的,所以不清楚通过执行
np.array([float(a),int(b)])
来实现什么。希望这能有所帮助。

看来您只是想将文本数据转换为
numpy
数组
。正如@BiRico所指出的,在一个
数组中不能有多个数据类型
dtype
,如果必须这样做,就必须使用
结构化数组
,或者更好的是使用
熊猫
数据帧

另外,
numpy
具有构建IO函数
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 ])     
>dtypeLS=[('Var0','S10'),
('Var1','S10'),
('Var2','f8'),

('Var3','你到底想做什么…返回一个列表,该列表相当于你想要的完整列,或者返回每一行只包含3列?感谢你的回复和关于如何更好地发布的评论。我是这个网站的新手,所以请原谅任何trnasgressions。基本上,我想做的事情可以在MATLAB中用,例如,我也来自Matlab,所以我知道python/numpy中的一些东西是不同的和/或不直观的。这个网站对我帮助很大,你们可能已经看过了。另外,它是一个可怕的首字母缩写词,但它可以提出很好的问题(和清晰的答案)。我正在尝试构建一个二维矩阵,可以在Matlab中使用,例如x(1,:)=[1,2,3,4];x(2,:)=[5,6,7,8];……然后制作各种绘图,例如绘图(x(:,1),x(:,3))或绘图(x(:,1),x(:,4)),我完全被PYTHON中的语法弄糊涂了,从将数据放入矩阵到正确分割以生成绘图
>>> 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 ])