Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Aký je proces generovania numpy karteziánskeho produktu v Pythone?

Numpy nemá vstavanú funkciu na priame výpočet karteziánskeho produktu. Funkcia „itertools.product“ zo štandardnej knižnice Pythonu je vo všeobecnosti najúčinnejším spôsobom, ako to dosiahnuť, najmä pre väčšie polia. V prípade potreby však môžete výsledok previesť na numpy pole.

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

Príklad použitia:

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)

Výstup:[[1 3 5]

[1 3 6]

[1 4 5]

[1 4 6]

[2 3 5]

[2 3 6]

[2 4 5]

[2 4 6]]

`` `

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.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené