Оптимальное извлечение столбцов из матрицы - PullRequest
2 голосов
/ 23 июля 2010

Скажем, у меня есть пустая матрица, например, так:

[[ x1, x2, x3, ... ],
 [ y1, y2, y3, ... ],
 [ z1, z2, z3, ... ],
 [ 1,  1,  1,  ... ]]

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

[[x1, y1, z1], [x2, y2, z2], [x3, y3, z3], ... ]

Какой самый оптимальный способделать это?

На данный момент у меня есть:

tpoints = [pt[:3].tolist() for pt in numpy.asarray(tptmat.T)]

И вызов tolist() занимает непропорциональное количество времени, примерно треть времени, потраченного в большинстве временипотребляющая функция моей программы.

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
 14422540   69.777    0.000   69.777    0.000 {method 'tolist' of 'numpy.ndarray' objects}
       20   64.258    3.213  178.057    8.903 trans.py:152(_apply)
      ...

Ответы [ 2 ]

3 голосов
/ 23 июля 2010

Почему бы не удалить последний ряд перед транспонированием?

m[:3].T.tolist()
#      ^^^^^^^^^ optional

Микропроцессор показывает, что этот метод быстрее вашего на 61%, а если вы не преобразуете его в список, он будет в 45 раз быстрее для матрицы 100 & times; 4.

$ python2.5 -m timeit -s 'import numpy; m = numpy.matrix([[5]*100,[6]*100,[7]*100,[1]*100])' 'm[:3].T'
100000 loops, best of 3: 6.26 usec per loop
$ python2.5 -m timeit -s 'import numpy; m = numpy.matrix([[5]*100,[6]*100,[7]*100,[1]*100])' 'm[:3].T.tolist()'
10000 loops, best of 3: 180 usec per loop
$ python2.5 -m timeit -s 'import numpy; m = numpy.matrix([[5]*100,[6]*100,[7]*100,[1]*100])' 'numpy.asarray(m[:3].T)'
100000 loops, best of 3: 10.9 usec per loop
$ python2.5 -m timeit -s 'import numpy; m = numpy.matrix([[5]*100,[6]*100,[7]*100,[1]*100])' '[p[:3].tolist()for p in numpy.asarray(m.T)]'
1000 loops, best of 3: 289 usec per loop
1 голос
/ 23 июля 2010

Вы пробовали zip(*matrix)? Это оставит вас с

[[x1, y1, z1, 1], [x2, y2, z2, 1], [x3, y3, z3, 1], ... ]

Но генерация списка, вероятно, все еще произойдет ...

Подождите (хлопает ладонью по лбу) ! Это должно сделать трюк:

zip(*matrix[:3])

В интерактивной оболочке:

>>> matrix = [[ 11, 12, 13, 14],
...           [ 21, 22, 23, 24],
...           [ 31, 32, 33, 34],
...           [  1,  1,  1,  1]]
>>> zip(*matrix[:3])
[(11, 21, 31), (12, 22, 32), (13, 23, 33), (14, 24, 34)]
>>>

Это список кортежей, но разве это имеет значение?

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