numpy高效解析字符串数组的方法

时间:2018-12-13 18:31:46

标签: python arrays numpy

所以我有这个字符串数组,是我从数据库查询中获得的

dat = [['1','2 3 4 5'],
['6', '7 8 9 10'],
['11', '12 13 14 15']]

从这个3x2数组中,我必须制作一个3x5的浮点数组来进行计算。现在,我只是将数组保存到一个tmp文件中,然后读取该文件以获得3x5数组,

np.savetxt(file,dat, fmt="%s\t%s")
np.loadtxt(file)

但是除了显式循环遍历元素以将它们拆分并转换外,还有没有更有效的numpy方法来做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以使用以下单线:

np.vstack(np.char.split(dat).sum(axis=1)).astype(np.float)

答案 1 :(得分:2)

使用常规的Python迭代:

def foo(row):
    res = []
    for x in row: res.extend(x.split())
    return res
In [141]: np.array([foo(row) for row in dat],int)
Out[141]: 
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15]])

它明显比np.char.split方法快:

In [143]: timeit np.vstack(np.char.split(dat).sum(axis=1)).astype(int)
61 µs ± 171 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [144]: timeit np.array([foo(row) for row in dat],int)
8.74 µs ± 239 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

和被拒绝的fromstring方法:

In [147]: timeit np.array([np.fromstring(' '.join(i), sep=' ') for i in dat],int)
13.9 µs ± 296 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

从评论中:

In [256]: timeit np.asarray([' '.join(j for i in dat for j in i).split(' ')], in
     ...: t).reshape(3 ,5)
10.1 µs ± 12.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [253]: ' '.join(j for i in dat for j in i)
Out[253]: '1 2 3 4 5 6 7 8 9 10 11 12 13 14 15'

本着同样的精神-字符串一次连接一行吗?

In [262]: timeit np.array([' '.join(row).split() for row in dat], int)
7.47 µs ± 122 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)