Effizientes Sortieren und Filtern eines JaggedArray durch ein anderes

stimmen
0

Das ist mehr eine peinliche-Array Frage, aber es ist eng verwandt mit entwurzeln .

Ich habe ein JaggedArray( awkward.array.jagged.JaggedArray) , die Indizes enthält, die Positionen in einem anderen Punkt JaggedArray. Beiden Anordnungen haben die gleiche Länge, aber jeweils die von , numpy.ndarraysdass die JaggedArraysvon unterschiedlicher Länge enthalten kann. Ich möchte das zweite Array unter Verwendung des Indizes der ersten Anordnung sortieren, die gleichzeitig die Elemente der zweiten Anordnung fällt , die nicht aus dem ersten Array indiziert ist. Das erste Array kann zusätzlich Wert von -1(könnte auch ersetzt werden durch, Nonewenn nötig, aber dies ist derzeit nicht Fall ist ) , das bedeutet , dass es keine Übereinstimmung in der zweiten Reihe ist. In einem solchen Fall sollte die entsprechende Position in dem ersten Array auf einen Standardwert gesetzt werden ( zum Beispiel 0).

Hier ist ein Beispiel aus der Praxis und wie löse ich das im Moment:

import uproot
import numpy as np
import awkward

def good_index(my_indices, my_values):
    my_list = []
    for index in my_indices:
        if index > -1:
            my_list.append(my_values[index])
        else:
            my_list.append(0)
    return my_list

indices = awkward.fromiter([[0, -1], [3,1,-1], [-1,0,-1]])
values = awkward.fromiter([[1.1, 1.2, 1.3], [2.1,2.2,2.3,2.4], [3.1]])

new_map = awkward.fromiter(map(good_index, indices, values))

Das resultierende new_mapist: [[1.1 0.0] [2.4 2.2 0.0] [0.0 3.1 0.0]].

Gibt es eine effizientere / schnelleren Weg , um dies zu erreichen? Ich dachte , dass man verwenden könnte numpyFunktionen wie numpy.where, aber aufgrund der unterschiedlichen Längen der ndarraysdies nicht gelingt zumindest für die Möglichkeiten , die ich versuchte.

Veröffentlicht am 09/10/2019 um 18:57
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Wenn alle der Sub - Arrays in valuesgarantiert nicht leer sein (so dass die Indizierung mit -1Renditen der letzten Subelement, kein Fehler), dann können Sie dies tun:

>>> almost = values[indices]       # almost what you want; uses -1 as a real index
>>> almost.content = awkward.MaskedArray(indices.content < 0, almost.content)
>>> almost.fillna(0.0)
<JaggedArray [[1.1 0.0] [2.4 2.2 0.0] [0.0 3.1 0.0]] at 0x7fe54c713c88>

Der letzte Schritt ist optional , da ohne sie die fehlenden Elemente sind None, statt 0.0.

Wenn einige der Sub - Arrays in valuesleer sind, können Sie padsie zu gewährleisten , dass sie mindestens ein Teilelement haben. Alle ursprünglichen Teilelemente werden auf die gleiche Art , wie sie vorher waren indiziert, da padnur die Länge zunimmt, wenn nötig.

>>> values = awkward.fromiter([[1.1, 1.2, 1.3], [], [2.1, 2.2, 2.3, 2.4], [], [3.1]])
>>> values.pad(1)
<JaggedArray [[1.1 1.2 1.3] [None] [2.1 2.2 2.3 2.4] [None] [3.1]] at 0x7fe54c713978>
Beantwortet am 11/10/2019 um 19:55
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more