Mam długą listę współrzędnych xy i chciałbym przekształcić go w tablicy numpy.dlaczego konwertowanie długiej listy 2D na tablicę numpy jest tak powolne?
>>> import numpy as np
>>> xy = np.random.rand(1000000, 2).tolist()
Oczywistym sposobem byłoby:
>>> a = np.array(xy) # Very slow...
Jednakże powyższy kod jest stanowczo za wolno. Co ciekawe, aby przetransponować długą listę najpierw, przekonwertuj ją na tablicę numpy, a następnie przetransferuj ją z powrotem znacznie szybciej (20x na moim laptopie).
>>> 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!
Czy to błąd numpy?
Edycja:
Jest to lista punktów (o współrzędnych XY) generowany w locie, tak zamiast preallocating tablicy i rozszerzenia, gdy jest to konieczne, lub utrzymywania dwóch 1D listy dla x i y, Myślę, że obecna reprezentacja jest najbardziej naturalna.
Dlaczego przechodzimy przez drugi indeks szybciej niż pierwszy indeks, biorąc pod uwagę, że przechodzimy przez listę python w obu kierunkach?
EDIT 2:
podstawie odpowiedzi @ Tiago i , znalazłem następujący kod dwa razy tak szybko, jak mojej oryginalnej wersji:
>>> 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))
To nie jest błąd, to funkcja! – Bitwise
Do czego służy ta funkcja? Jedyne, co mogę o tym myśleć, to sprawdzenie, czy każda z wewnętrznych list jest tej samej długości, ale nie sądzę, że zajęłoby to tak długo ... – herrlich10
@ herrlich10 list niekoniecznie sąsiadujących w pamięci, więc 'np. array' przeplata pierwszy indeks (indeks listy) i dodaje go do tablicy. Dlatego trwa dłużej, gdy pierwszy indeks jest znacznie większy niż drugi. – tiago