所以我有这个字符串数组,是我从数据库查询中获得的
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方法来做到这一点?
答案 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)