2015-12-21 133 views
1

我試圖將'b'(其中列條目由一個分隔符分隔並且行由另一個分隔符分隔的字符串)轉換爲'a'(2d numpy數組) ,如:將字符串轉換爲2d numpy數組

b='191.250\t0.00\t0\t1\n191.251\t0.00\t0\t1\n191.252\t0.00\t0\t1\n' 
a=numpy.array([[191.25,0,0,1],[191.251,0,0,1],[191.252,0,0,1]]) 

我是(用我所知,有4列在 'A')這樣做的方式:

a=numpy.array(filter(None,re.split('[\n\t]+',b)),dtype=float).reshape(-1,4) 

有沒有更好的辦法?

+0

有什麼不對的呢? – user4421975

+0

什麼都沒有,我的方式很有效,我只是從我在網上找到的東西拼湊而成。我只是想知道是否有一種「更加正確」的方式來做到這一點,一種不使用正則表達式的方法,和/或一種不需要先知道列數的方法。 –

回答

1

這裏是我做了什麼讓你正在尋找的結果是:

import numpy as np 

b='191.250\t0.00\t0\t1\n191.251\t0.00\t0\t1\n191.252\t0.00\t0\t1\n' 
a = np.array([[float(j) for j in i.split('\t')] for i in b.splitlines()]) 
1

而是分裂和過濾的,你可以使用np.fromstring

>>> np.fromstring(b, sep='\t').reshape(-1, 4) 
array([[ 191.25 , 0. , 0. , 1. ], 
     [ 191.251, 0. , 0. , 1. ], 
     [ 191.252, 0. , 0. , 1. ]]) 

所以整形需要這總是返回一維數組。

另外,爲了避免重塑,如果你已經有個字節的字符串(如字符串在Python 2),你可以使用np.genfromtxt(與標準庫的IO模塊的幫助下):

>>> import io 
>>> np.genfromtxt(io.BytesIO(b)) 
array([[ 191.25 , 0. , 0. , 1. ], 
     [ 191.251, 0. , 0. , 1. ], 
     [ 191.252, 0. , 0. , 1. ]]) 

genfromtxt可處理缺失值,並提供對最終數組創建方式的更多控制。

相關問題