Προγραμματισμός

Γνώση Υπολογιστών >> Προγραμματισμός >  >> Python Προγραμματισμός

Ποια είναι η διαδικασία για τη δημιουργία ενός καρτεσιανού προϊόντος στο Python;

Το Numpy δεν διαθέτει ενσωματωμένη λειτουργία για να υπολογίσει άμεσα το καρτεσιανό προϊόν. Η λειτουργία `itertools.product 'από την τυπική βιβλιοθήκη της Python είναι γενικά ο πιο αποτελεσματικός τρόπος για να επιτευχθεί αυτό, ειδικά για μεγαλύτερες συστοιχίες. Ωστόσο, μπορείτε στη συνέχεια να μετατρέψετε το αποτέλεσμα σε μια συστοιχία Numpy, αν χρειαστεί.

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

Μέθοδος 1:Χρήση `itertools.product` (συνιστάται)

Αυτή είναι η πιο αποτελεσματική και πύθων προσέγγιση:

`` `Python

Εισαγωγή Numpy ως NP

από το προϊόν εισαγωγής IterTools

def cartesian_product_itertools (συστοιχίες):

"" "Δημιουργεί το καρτεσιανό προϊόν πολλαπλών συστοιχιών χρησιμοποιώντας το iTertools.Product.

Args:

συστοιχίες:Μια λίστα με συστοιχίες numpy.

Επιστρέφει:

Μια συστοιχία που αντιπροσωπεύει το καρτεσιανό προϊόν. Δεν επιστρέφει κανένα εάν η είσοδος δεν είναι άκυρη.

"" "

Εάν δεν είναι ISInstance (Arrays, List):

Επιστρέψτε κανένα

Αν όχι όλα (ISInstance (arr, np.ndarray) για ARR σε συστοιχίες):

Επιστρέψτε κανένα

Επιστρέψτε το np.array (λίστα (προϊόν (*arrays)))

Παράδειγμα χρήσης:

Array1 =np.array ([1, 2])

Array2 =np.array ([3, 4])

Array3 =np.array ([5, 6])

Αποτέλεσμα =cartesian_product_itertools ([Array1, Array2, Array3])

εκτύπωση (αποτέλεσμα)

Έξοδος:[[1 3 5]

[1 3 6]

[1 4 5]

[1 4 6]

[2 3 5]

[2 3 6]

[2 4 5]

[2 4 6]]

`` `

Μέθοδος 2:Χρήση ένθετων βρόχων (λιγότερο αποτελεσματικοί, αποφύγετε για μεγάλες συστοιχίες)

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

`` `Python

Εισαγωγή Numpy ως NP

def cartesian_product_nested_loops (συστοιχίες):

"" "Δημιουργεί το καρτεσιανό προϊόν χρησιμοποιώντας ένθετες βρόχους (λιγότερο αποδοτικό)." ""

Αν όχι όλα (ISInstance (arr, np.ndarray) για ARR σε συστοιχίες):

Επιστρέψτε κανένα

num_arrays =len (συστοιχίες)

σχήματα =[arr.shape for arr σε συστοιχίες]

result_shape =(np.prod ([σχήμα [0] για σχήμα σε σχήματα]), num_arrays)

αποτέλεσμα =np.zeros (result_shape, dtype =np.int32)

για το I, ARR σε απαριθμούνται (συστοιχίες):

indexer =[φέτα (καμία)] * num_arrays

indexer [i] =φέτα (καμία)

# Χρήση προηγμένης ευρετηρίασης για τη δημιουργία καρτεσιανού προϊόντος

arr_repeated =np.tile (arr, (np.prod ([sh [0] για sh σε σχήματα [:i] + σχήματα [i + 1:]]), 1))), 1)), 1)), 1)), 1))

Αποτέλεσμα [:, i] =arr_repeated.reshape (result_shape [0])

αποτέλεσμα επιστροφής

Αποτέλεσμα =cartesian_product_nested_loops ([Array1, Array2, Array3])

εκτύπωση (αποτέλεσμα)

`` `

Γιατί προτιμάται το `itertools.product`:

* Αποδοτικότητα: Το `itertools.product` είναι εξαιρετικά βελτιστοποιημένο για τη δημιουργία καρτεσιανών προϊόντων. Αποφεύγει τη δημιουργία μεγάλων ενδιάμεσων συστοιχιών, καθιστώντας την πολύ πιο αποδοτική μνήμη, ειδικά όταν ασχολείται με πολλές ή μεγάλες συστοιχίες εισόδου.

* Αναγνωσιμότητα: Ο κώδικας που χρησιμοποιεί το `itertools.product` είναι καθαρότερος και πιο κατανοητός.

Η προσέγγιση του ένθετου βρόχου, ενώ απεικονίζει την υποκείμενη έννοια, γίνεται δραστικά πιο αργή και λιγότερο αποδοτική μνήμη καθώς ο αριθμός των συστοιχιών εισόδου ή τα μεγέθη τους αυξάνονται. Επομένως, χρησιμοποιείτε πάντα το `itertools.product 'για τη δημιουργία καρτεσιανών προϊόντων στην Python, ειδικά μέσα σε ένα numpy πλαίσιο. Μόνο καταφύγετε σε ένθετους βρόχους για εκπαιδευτικούς σκοπούς ή πολύ μικρά, απλά παραδείγματα. Θυμηθείτε να χειριστείτε πιθανά σφάλματα, όπως παρέχοντας μη λίστα εισροών ή μη-ανυπόφορες συστοιχίες, όπως φαίνεται στο παράδειγμα με έλεγχο σφαλμάτων.

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα