Numpy não possui uma função interna para calcular diretamente o produto cartesiano. A função `itetools.product` da biblioteca padrão do Python é geralmente a maneira mais eficiente de conseguir isso, especialmente para matrizes maiores. No entanto, você pode converter o resultado em uma matriz Numpy, se necessário.
Veja como você pode fazer isso, juntamente com explicações e comparações com outros métodos menos eficientes:
Método 1:Usando `` itetools.product` (recomendado) Esta é a abordagem mais eficiente e pitônica:
`` `Python
importar numpy como np
do produto de importação de itertools
def Cartesian_product_iterTools (matrizes):
"" "" Gera o produto cartesiano de várias matrizes usando o itertools.product.
Args:
Matrizes:uma lista de matrizes numpy.
Retornos:
Uma matriz Numpy representando o produto cartesiano. Retorna nenhum se a entrada for inválida.
"" "
se não é o ISInstance (matrizes, list):
retornar nenhum
se não todos (isinstance (arr, np.ndarray) para arr em matrizes):
retornar nenhum
Retorne np.array (list (produto (*matrizes))))
Exemplo de uso:
Array1 =np.array ([1, 2])
Array2 =np.array ([3, 4])
Array3 =np.array ([5, 6])
resultado =cartesian_product_itertools ([Array1, Array2, Array3])
Imprimir (resultado)
Saída:[[1 3 5]
[1 3 6]
[1 4 5]
[1 4 6]
[2 3 5]
[2 3 6]
[2 4 5]
[2 4 6]]
`` `
Método 2:Usando loops aninhados (menos eficiente, evite matrizes grandes) Este método é conceitualmente mais simples, mas significativamente mais lento para matrizes de entrada maiores:
`` `Python
importar numpy como np
Def Cartesian_product_nested_loops (matrizes):
"" "" Gera o produto cartesiano usando loops aninhados (menos eficientes). "" "
se não todos (isinstance (arr, np.ndarray) para arr em matrizes):
retornar nenhum
num_arrays =len (matrizes)
Shapes =[arr.Shape for ARR em matrizes]
resultado_shape =(np.prod ([forma [0] para a forma em formas]), num_arrays)
resultado =np.zeros (resultado_shape, dtype =np.int32)
para i, arr em enumerado (matrizes):
indexer =[slice (nenhum)] * num_arrays
indexador [i] =slice (nenhum)
# Usando indexação avançada para gerar produto cartesiano
arr_Repeated =np.Tile (arr, (np.prod ([sh [0] para sh em formas [:i] + formas [i + 1:]]), 1)))
Resultado [:, i] =arr_repeated.rehape (resultado_shape [0])
resultado de retorno
resultado =cartesian_product_nested_loops ([Array1, Array2, Array3])
Imprimir (resultado)
`` `
Por que `itetools.product` é preferido: *
Eficiência: `itetools.product` é altamente otimizado para gerar produtos cartesianos. Evita a criação de grandes matrizes intermediárias, tornando-o muito mais eficiente em termos de memória, especialmente ao lidar com muitas ou grandes matrizes de entrada.
*
Legabilidade: O código usando `itetools.product` é mais limpo e mais fácil de entender.
A abordagem de loop aninhada, enquanto ilustra o conceito subjacente, torna-se drasticamente mais lento e menos eficiente em termos de memória à medida que o número de matrizes de entrada ou seus tamanhos aumentam. Portanto,
sempre use `` itetools.product` para gerar produtos cartesianos em python, especialmente dentro de um contexto Numpy. Somente recorra a loops aninhados para fins educacionais ou exemplos simples e muito pequenos. Lembre-se de lidar com possíveis erros, como fornecer uma entrada não-lista ou matrizes não numidas, como mostrado no exemplo com a verificação de erros.