Αποτελεσματικά διαλογής και διήθηση ενός JaggedArray με άλλο

ψήφοι
0

Αυτό είναι περισσότερο μια δύσκολη συστοιχία ερώτηση, αλλά είναι στενά συνδεδεμένη με ξεριζώσει .

Έχω μια JaggedArray( awkward.array.jagged.JaggedArray) που περιέχει δείκτες που δείχνουν σε θέσεις σε ένα άλλο JaggedArray. Και οι δύο σειρές έχουν το ίδιο μήκος, αλλά το καθένα από το numpy.ndarraysότι το JaggedArraysπεριέχει μπορεί να είναι διαφορετικού μήκους. Θα ήθελα να ταξινομήσετε τη δεύτερη σειρά, χρησιμοποιώντας τους δείκτες του πρώτου πίνακα, την ίδια στιγμή πέφτουν τα στοιχεία από το δεύτερο πίνακα που δεν υπάρχουν στο ευρετήριο από την πρώτη σειρά. Η πρώτη συστοιχία μπορεί επιπροσθέτως να περιέχουν τιμές -1(θα μπορούσε επίσης να αντικατασταθεί από Noneαν χρειαστεί, αλλά αυτό δεν είναι επί του παρόντος ότι η περίπτωση) που σημαίνει ότι δεν υπάρχει καμία αντιστοιχία στη δεύτερη συστοιχία. Σε μια τέτοια περίπτωση, η αντίστοιχη θέση στην πρώτη συστοιχία θα πρέπει να ρυθμιστεί σε μια προκαθορισμένη τιμή (π.χ. 0).

Εδώ είναι ένα πρακτικό παράδειγμα και πώς θα λύσουμε αυτό αυτή τη στιγμή:

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))

Το προκύπτον new_mapείναι: [[1.1 0.0] [2.4 2.2 0.0] [0.0 3.1 0.0]].

Είναι ένας πιο αποτελεσματικός / γρηγορότερος τρόπος για να επιτευχθεί αυτό; Σκεφτόμουν ότι θα μπορούσε κανείς να χρησιμοποιήσει numpyτη λειτουργικότητα, όπως numpy.where, αλλά λόγω των διαφορετικών μηκών του ndarraysαυτό αποτύχει, τουλάχιστον για τους τρόπους που έχω δοκιμάσει.

Δημοσιεύθηκε 09/10/2019 στις 18:57
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Αν όλα τα υποπαρατάξεων το valuesείναι εγγυημένα για να είναι μη-κενό (έτσι ώστε ευρετηρίαση με -1αποδόσεις το τελευταίο υποστοιχείο, δεν είναι λάθος), τότε μπορείτε να το κάνετε αυτό:

>>> 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>

Το τελευταίο βήμα είναι προαιρετικό, διότι χωρίς αυτήν, τα ελλείποντα στοιχεία είναι None, όχι 0.0.

Αν κάποια από τις υποπαρατάξεων στο valuesείναι άδειο, μπορείτε padνα εξασφαλιστεί ότι έχουν τουλάχιστον ένα υποστοιχείο. Όλα τα πρωτότυπα υποστοιχεία που αναπροσαρμόζονται με τον ίδιο τρόπο που ήταν πριν, δεδομένου ότι padαυξάνει το μήκος, αν χρειαστεί.

>>> 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>
Απαντήθηκε 11/10/2019 στις 19:55
πηγή χρήστη

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