将字符串转换为二维NumPy数组

3
我将尝试将“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)

有更好的方法吗?


你的方式有什么问题? - OMRY VOLK
没什么问题,我的方法可行,只是从网上找到的一些东西拼凑起来的。我只是想知道是否有一种“更正确”的方法来做这件事,一种不使用正则表达式的方法,以及一种不需要预先知道列数的方法。 - A B
2个回答

6

不必进行分割和过滤,可以使用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.   ]])
< p > < code > genfromtxt 处理缺失值,并提供更多控制如何创建最终数组的方法。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接