Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
Tu je návod, ako to môžete urobiť, spolu s vysvetleniami a porovnaním s inými menej efektívnymi metódami:
Metóda 1:Použitie `itertools.product` (odporúčané)
Toto je najúčinnejší a pythonický prístup:
`` `Python
import numpy ako np
z produktu Itertools Import
def cartesian_product_itertools (polia):
"" "Generuje karteziánsky produkt viacerých polí pomocou itertools.product.
ARG:
Polia:Zoznam numpy polí.
Návraty:
Numpy pole predstavujúce karteziánsky produkt. Vracia sa, ak je vstup neplatný.
"" "
Ak nie je Isinstance (polia, zoznam):
NOT
Ak nie všetky (Isinstance (ARR, np.ndarray) pre ARR v poliach):
NOT
return np.array (zoznam (produkt (*polia))))))
array1 =np.array ([1, 2])
array2 =np.array ([3, 4])
array3 =np.array ([5, 6])
result =cartesian_product_itertools ([Array1, Array2, Array3])
tlač (výsledok)
`` `
Metóda 2:Použitie vnorených slučiek (menej efektívne, vyhnite sa veľkým poliam)
Táto metóda je koncepčne jednoduchšia, ale výrazne pomalšia pre väčšie vstupné polia:
`` `Python
import numpy ako np
def cartesian_product_nest_loops (polia):
"" "Generuje karteziánsky produkt pomocou vnorených slučiek (menej efektívny)." "
Ak nie všetky (Isinstance (ARR, np.ndarray) pre ARR v poliach):
NOT
num_arrays =Len (polia)
tvary =[arr.shape pre ARR v poliach]
result_shape =(np.prod ([tvar [0] pre tvar v tvaroch]), num_arrays)
result =np.zeros (result_shape, dtype =np.int32)
pre i, arr in Enumate (polia):
indexer =[slice (none)] * num_arrays
indexer [i] =Slice (žiadny)
# Použitie pokročilého indexovania na generovanie karteziánskeho produktu
arr_repeated =np.tile (arr, (np.prod ([sh [0] pre sh v tvaroch [:i] + tvary [i + 1:]]), 1))
Výsledok [:, i] =arr_repeated.Reshape (result_shape [0])
výsledok návratnosti
result =cartesian_product_nest_loops ([Array1, Array2, Array3])
tlač (výsledok)
`` `
Prečo je uprednostňovaný `itertools.product:
* Účinnosť: `itertools.product 'je vysoko optimalizovaný pre generovanie karteziánskych výrobkov. Vyhýba sa vytvoreniu veľkých stredne pokročilých polí, vďaka čomu je oveľa efektívnejšia, najmä pri riešení mnohých alebo veľkých vstupných polí.
* Čítateľnosť: Kód používajúci `itertools.product` je čistejší a ľahšie pochopiteľný.
Vnorená slučka prístup, zatiaľ čo ilustruje základný koncept, sa stáva drasticky pomalší a menej efektívny, keď sa zvyšuje počet vstupných polí alebo ich veľkostí. Preto vždy používajte `itertools.product` na generovanie karteziánskych výrobkov v Pythone, najmä v numpskom kontexte. Uchýliť sa iba k vnoreným slučkám na vzdelávacie účely alebo veľmi malé, jednoduché príklady. Nezabudnite zvládnuť potenciálne chyby, napríklad poskytnutie vstupu bez zoznamu alebo nekrapovacích polí, ako je uvedené v príklade pri kontrole chýb.