我试图将'b'(一个字符串,其中列条目由一个分隔符分隔,并且行由另一个分隔符分隔)转换为'a'(一个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]])
我这样做的方式是(根据我的知识,'a'中有4列):
a=numpy.array(filter(None,re.split('[\n\t]+',b)),dtype=float).reshape(-1,4)
有更好的方法吗?
答案 0 :(得分:3)
您可以使用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
处理缺失值,并提供对最终数组创建方式的更多控制。
答案 1 :(得分:2)
以下是我为了获得您正在寻找的结果所做的工作:
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()])