NumPy heeft geen ingebouwde functie om het Cartesiaanse product rechtstreeks te berekenen. De functie `itertools.product` uit de standaardbibliotheek van Python is over het algemeen de meest efficiënte manier om dit te bereiken, vooral voor grotere arrays. U kunt het resultaat echter indien nodig naar een NumPy-array converteren.
Hier leest u hoe u het kunt doen, samen met uitleg en vergelijkingen met andere, minder efficiënte methoden:
Methode 1:`itertools.product` gebruiken (aanbevolen)
Dit is de meest efficiënte en Pythonische aanpak:
```python
importeer numpy als np
van itertools importproduct
def cartesiaanse_product_itertools(arrays):
"""Genereert het Cartesiaanse product van meerdere arrays met behulp van itertools.product.
Argumenten:
arrays:een lijst met NumPy-arrays.
Retouren:
Een NumPy-array die het Cartesiaanse product vertegenwoordigt. Retourneert Geen als de invoer ongeldig is.
"""
zo niet isinstance(arrays, lijst):
retour Geen
zo niet all(isinstance(arr, np.ndarray) voor arr in arrays):
retour Geen
return np.array(lijst(product(*arrays)))
Voorbeeld gebruik:
array1 =np.array([1, 2])
array2 =np.array([3, 4])
array3 =np.array([5, 6])
resultaat =cartesiaanse_product_itertools([array1, array2, array3])
afdrukken(resultaat)
Uitvoer:[[1 3 5]
[1 3 6]
[1 4 5]
[1 4 6]
[2 3 5]
[2 3 6]
[2 4 5]
[2 4 6]]
```
Methode 2:Geneste lussen gebruiken (minder efficiënt, vermijd grote arrays)
Deze methode is conceptueel eenvoudiger maar aanzienlijk langzamer voor grotere invoerarrays:
```python
importeer numpy als np
def cartesiaanse_product_nested_loops(arrays):
"""Genereert het Cartesiaanse product met behulp van geneste lussen (minder efficiënt)."""
zo niet all(isinstance(arr, np.ndarray) voor arr in arrays):
retour Geen
aantal_arrays =len(arrays)
vormen =[arr.shape voor arr in arrays]
result_shape =(np.prod([shape[0] voor vorm in vormen]), num_arrays)
resultaat =np.nul(resultaat_vorm, dtype=np.int32)
voor i, arr in opsomming(arrays):
indexer =[slice(Geen)] * aantal_arrays
indexer[i] =segment(Geen)
# met behulp van geavanceerde indexering om een cartesiaans product te genereren
arr_repeated =np.tile(arr, (np.prod([sh[0] voor sh in vormen[:i] + vormen[i+1:]]),1))
resultaat[:,i] =arr_repeated.reshape(resultaat_vorm[0])
resultaat terug
resultaat =cartesisch_product_nested_loops([array1, array2, array3])
afdrukken(resultaat)
```
Waarom `itertools.product` de voorkeur heeft:
* Efficiëntie: `itertools.product` is sterk geoptimaliseerd voor het genereren van Cartesiaanse producten. Het vermijdt het creëren van grote tussenliggende arrays, waardoor het veel geheugenefficiënter wordt, vooral als het om veel of grote invoerarrays gaat.
* Leesbaarheid: De code die `itertools.product` gebruikt, is schoner en gemakkelijker te begrijpen.
De geneste lusbenadering illustreert weliswaar het onderliggende concept, maar wordt drastisch langzamer en minder geheugenefficiënt naarmate het aantal invoerarrays of hun omvang toeneemt. Gebruik daarom altijd `itertools.product` voor het genereren van Cartesiaanse producten in Python, vooral binnen een NumPy-context. Gebruik alleen geneste lussen voor educatieve doeleinden of zeer kleine, eenvoudige voorbeelden. Vergeet niet om potentiële fouten af te handelen, zoals het opgeven van een niet-lijstinvoer of niet-NumPy-arrays, zoals weergegeven in het voorbeeld met foutcontrole. |