2015-12-21 136 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可处理缺失值,并提供对最终数组创建方式的更多控制。

相关问题