Numpy эффективный способ разбора массива строк - PullRequest
0 голосов
/ 13 декабря 2018

Итак, у меня есть этот массив строк, который я получил из запроса к базе данных

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)

Но кроме явного зацикливания элементов, разделяющих их и конвертирующих, есть либолее эффективный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Использование обычной итерации 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)
0 голосов
/ 13 декабря 2018

Вы можете использовать следующие однострочные:

np.vstack(np.char.split(dat).sum(axis=1)).astype(np.float)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...