es wie Sortierung numpy strukturiert und Rekord-Arrays von einer einzigen Spalte sieht viel langsamer als eine Art auf einem ähnlichen eigenständigen Array tun:Arrays numpy strukturiert und Rekord Sortierung ist sehr langsam
In [111]: a = np.random.rand(1e4)
In [112]: b = np.random.rand(1e4)
In [113]: rec = np.rec.fromarrays([a,b])
In [114]: timeit rec.argsort(order='f0')
100 loops, best of 3: 18.8 ms per loop
In [115]: timeit a.argsort()
1000 loops, best of 3: 891 µs per loop
Es gibt eine marginale Verbesserung die strukturierte Anordnung verwendet wird, aber es ist nicht dramatisch:
In [120]: struct = np.empty(len(a),dtype=[('a','f8'),('b','f8')])
In [121]: struct['a'] = a
In [122]: struct['b'] = b
In [124]: timeit struct.argsort(order='a')
100 loops, best of 3: 15.8 ms per loop
Dies zeigt an, dass es möglicherweise schneller einen Index Array von argsort zu erstellen und dann, dass die einzelnen Felder neu anordnen verwenden. Dies ist OK, außer dass ich mit sehr großen Arrays zu tun habe und es vermeiden möchte, Daten so viel wie möglich zu kopieren. Gibt es einen effizienteren Weg, der mir fehlt?
Der einzige Grund dafür ist, dass 'np.take' eine Kopie erstellt, wenn Sie einen 'out'-Parameter angeben und den Modus' mode' im Standard '' raise''-Zustand belassen. Sie können [an der Quelle] suchen (https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/item_selection.c#L99). Wenn Sie einen anderen 'Modus' verwenden, wird es keine Kopie geben, aber die Ausgabe wird Müll sein, wobei einige Werte mehrere Male wiederholt werden und andere ganz fehlen. – Jaime