У меня длинный список координат xy и хотел бы преобразовать его в массив numpy.
>>> import numpy as np
>>> xy = np.random.rand(1000000, 2).tolist()
Очевидным будет:
>>> a = np.array(xy) # Very slow...
Однако вышеупомянутый код необоснованно медленный. Интересно, что сначала перенести длинный список, преобразовать его в массив numpy, а затем переставить назад было бы намного быстрее (20x на моем ноутбуке).
>>> def longlist2array(longlist):
... wide = [[row[c] for row in longlist] for c in range(len(longlist[0]))]
... return np.array(wide).T
>>> a = longlist2array(xy) # 20x faster!
Является ли это ошибкой numpy?
EDIT:
Это список точек (с координатами xy), сгенерированных "на лету", поэтому вместо предварительного распределения массива и при необходимости увеличивая его или поддерживая два 1D-списка для x и y, я думаю, что текущее представление является наиболее естественным.
Почему цикл по второму индексу быстрее, чем первый индекс, учитывая, что мы итерируем через список python в обоих направлениях?
ИЗМЕНИТЬ 2:
На основе ответа @tiago и этот вопрос, я нашел следующий код в два раза быстрее, чем моя оригинальная версия:
>>> from itertools import chain
>>> def longlist2array(longlist):
... flat = np.fromiter(chain.from_iterable(longlist), np.array(longlist[0][0]).dtype, -1) # Without intermediate list:)
... return flat.reshape((len(longlist), -1))