将字符串转换为2d numpy数组

时间:2015-12-21 17:59:57

标签: python arrays string numpy

我试图将'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)

有更好的方法吗?

2 个答案:

答案 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()])