Δείτε πώς μπορείτε να το κάνετε, μαζί με εξηγήσεις και συγκρίσεις με άλλες λιγότερο αποδοτικές μεθόδους:
Μέθοδος 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])
εκτύπωση (αποτέλεσμα)
`` `
Μέθοδος 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 πλαίσιο. Μόνο καταφύγετε σε ένθετους βρόχους για εκπαιδευτικούς σκοπούς ή πολύ μικρά, απλά παραδείγματα. Θυμηθείτε να χειριστείτε πιθανά σφάλματα, όπως παρέχοντας μη λίστα εισροών ή μη-ανυπόφορες συστοιχίες, όπως φαίνεται στο παράδειγμα με έλεγχο σφαλμάτων.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα