簡體   English   中英

使用numpy loadtxt函數從文本文件讀取值

[英]read values from a text file using numpy loadtxt function

我有一個具有這種形式的文件:

label1, value1, value2, value3,
label2, value1, value2, value3,
...

我想使用numpy loadtxt函數讀取它,因此我可以將每個標簽及其值放在一個數組中,因此最終結果將是一個數組數組,其中每個數組都包含標簽和功能數組,如下所示:

array([[label1, [value1, value2, value3]],
       [label2, [value1, value2, value3]]])

我已經嘗試了以下方法,但是沒有用:

c = StringIO(u"text.txt")
np.loadtxt(c,
   dtype={'samples': ('label', 'features'), 'formats': ('s9',np.float)},
   delimiter=',', skiprows=0)

任何想法?

最現代,最通用的方法是使用熊貓,熊貓的解析器具有更多選項和管理標簽。

假設您的文件包含:

A,7,5,1
B,4,2,7

然后 :

In [29]: import pandas as pd
In [30]: df=pd.read_csv('data.csv',sep=',',header=None,index_col=0)

In [31]: df
Out[31]: 
   1  2  3
0         
A  7  5  1
B  4  2  7

您現在可以輕松地將其轉換為struct數組:

In [32]: a=df.T.to_records(index=False)
Out[32]: 
rec.array([(7, 4), (5, 2), (1, 7)], 
          dtype=[('A', '<i8'), ('B', '<i8')])

In [33]: a['A']
Out[33]: array([7, 5, 1], dtype=int64)

使用loadtext您將不得不手動執行許多低級操作。

您在定義dtype的位置正確。 您只是缺少字段形狀。

我將演示:

“文本”文件-行列表(Py3中的字節):

In [95]: txt=b"""label1, 12, 23.2, 232
   ....: label2, 23, 2324, 324
   ....: label3, 34, 123, 2141
   ....: label4, 0, 2, 3
   ....: """

In [96]: txt=txt.splitlines()

一個具有2個字段的dtype ,一個帶有字符串,另一個帶有浮點數(“ field shape”為3):

In [98]: dt=np.dtype([('label','U10'),('values', 'float',(3))])

In [99]: data=np.genfromtxt(txt,delimiter=',',dtype=dt)

In [100]: data
Out[100]: 
array([('label1', [12.0, 23.2, 232.0]), ('label2', [23.0, 2324.0, 324.0]),
       ('label3', [34.0, 123.0, 2141.0]), ('label4', [0.0, 2.0, 3.0])], 
      dtype=[('label', '<U10'), ('values', '<f8', (3,))])

In [101]: data['label']
Out[101]: 
array(['label1', 'label2', 'label3', 'label4'], 
      dtype='<U10')

In [103]: data['values']
Out[103]: 
array([[  1.20000000e+01,   2.32000000e+01,   2.32000000e+02],
       [  2.30000000e+01,   2.32400000e+03,   3.24000000e+02],
       [  3.40000000e+01,   1.23000000e+02,   2.14100000e+03],
       [  0.00000000e+00,   2.00000000e+00,   3.00000000e+00]])

通過此定義,可以將數值作為2d數組進行訪問。 像這樣的子陣列受到贊賞。

可以使用字典語法指定dtype ,但是我對元組形式列表更加熟悉。

等效dtype規格:

np.dtype("U10, (3,)f")
np.dtype({'names':['label','values'], 'formats':['S10','(3,)f']})
np.genfromtxt(txt,delimiter=',',dtype='S10,(3,)f')

==============================

我認為,如果使用dtype=None解析此txt,將會產生

In [30]: y
Out[30]: 
array([('label1', 12.0, 23.2, 232.0), ('label2', 23.0, 2324.0, 324.0),
       ('label3', 34.0, 123.0, 2141.0), ('label4', 0.0, 2.0, 3.0)], 
      dtype=[('f0', '<U10'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])

可以使用轉換為子字段形式

y.view(dt)

只要基礎數據表示形式(視為平面字節列表)兼容(此處為10個unicode字符(40個字節),每個記錄3個浮點數),此方法就起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM