Эффективный способ преобразовать разделенную разделителем строку в массив NumPy - PullRequest
11 голосов
/ 22 марта 2012

У меня есть строка следующим образом:

1|234|4456|789

Я должен преобразовать его в массив numpy. Я хотел бы знать наиболее эффективный способ. Поскольку я буду вызывать эту функцию более 50 миллионов раз!

Ответы [ 3 ]

17 голосов
/ 22 марта 2012

Самый быстрый способ - использовать метод numpy.fromstring :

>>> import numpy
>>> data = "1|234|4456|789"
>>> numpy.fromstring(data, dtype=int, sep="|")
array([   1,  234, 4456,  789])
7 голосов
/ 22 марта 2012

@ jterrace выигрывает один (1) интернет.

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

Для тех, кто не знаком с timeit , флаг -s позволяет вам указать бит кода, который будет выполняться только один раз .


Самый быстрый и наименее перегруженный способ - использовать numpy.fromstring в соответствии с рекомендациями jterrace:

python -mtimeit -s"import numpy;s='1|2'" "numpy.fromstring(s,dtype=int,sep='|')"
100000 loops, best of 3: 1.85 usec per loop

В следующих трех примерах используется string.split в сочетании с другим инструментом.

string.split с numpy.fromiter

python -mtimeit -s"import numpy;s='1|2'" "numpy.fromiter(s.split('|'),dtype=int)"
100000 loops, best of 3: 2.24 usec per loop

string.split с int() приведением через выражение-генератора

python -mtimeit -s"import numpy;s='1|2'" "numpy.array(int(x) for x in s.split('|'))"
100000 loops, best of 3: 3.12 usec per loop

string.split с массивом NumPy типа int

python -mtimeit -s"import numpy;s='1|2'" "numpy.array(s.split('|'),dtype=int)"
100000 loops, best of 3: 9.22 usec per loop
5 голосов
/ 22 марта 2012

Попробуйте это:

import numpy as np
s = '1|234|4456|789'
array = np.array([int(x) for x in s.split('|')])

... Предполагая, что числа все целые. если нет, замените int на float в приведенном выше фрагменте кода.

РЕДАКТИРОВАТЬ 1:

В качестве альтернативы, вы можете сделать это, он создаст только один промежуточный список (тот, который генерируется split()):

array = np.array(s.split('|'), dtype=int)

РЕДАКТИРОВАТЬ 2:

И еще один способ, возможно, быстрее (спасибо за все комментарии, ребята!):

array = np.fromiter(s.split("|"), dtype=int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...