2

Я начинающий программист, начинающий код в python. У меня есть два массива 2D numpy, которые я хочу объединить, чтобы сформировать массив 4D numpy следующим образом:
array_4d[i, j, k, l] = array_1[i, j] * array_2[k, l]
Я могу, конечно, переделать это, написав вложенные для циклов, но я хочу знать, есть ли более эффективный способ для этого, и если эта операция уже предопределена в каком-то пакете. СпасибоМатричные прямые индексы сохранения продукта в python

ответ

3

Вы имели в виду np.einsum? Это позволяет вам записать это довольно элегантно:

>>> import numpy as np 
>>> a = np.random.random_integers(0,9, (2,2)) 
>>> b = np.random.random_integers(0,9, (3,3)) 
>>> c = np.einsum('ij,kl-> ijkl', a, b) 
>>> a 
array([[4, 5], 
     [8, 0]]) 
>>> b 
array([[6, 8, 4], 
     [8, 5, 5], 
     [8, 9, 8]]) 
>>> c 
array([[[[24, 32, 16], 
     [32, 20, 20], 
     [32, 36, 32]], 

     [[30, 40, 20], 
     [40, 25, 25], 
     [40, 45, 40]]], 


     [[[48, 64, 32], 
     [64, 40, 40], 
     [64, 72, 64]], 

     [[ 0, 0, 0], 
     [ 0, 0, 0], 
     [ 0, 0, 0]]]]) 

Петли будут на C, так что это быстро.

Данный продукт может также легко сделано с вещании Numpy в:

>>> c2 = a[...,np.newaxis, np.newaxis]*b 
>>> np.any(c2-c) 
False # indicates that both approaches result in the same ndarray 

Этот последний подход оказывается даже быстрее, но имейте в виду, что временные результаты часто зависят от входных массивов:

In [61]: a = np.random.random_integers(0,9, (20,30)) 

In [62]: b = np.random.random_integers(0,9, (300,500)) 

In [63]: %timeit c2 = a[...,np.newaxis, np.newaxis]*b 
1 loops, best of 3: 250 ms per loop 

In [64]: %timeit c = np.einsum('ij,kl-> ijkl', a, b) 
1 loops, best of 3: 342 ms per loop 
+0

Спасибо, что блестяще! Именно то, что мне нужно. – user231042

+0

@ user231042 вы должны принять ответ. [Ответчик получит очки и * вы получите очки] (http://stackoverflow.com/help/accepted-answer)! Выиграйте Win! – tmthydvnprt

Смежные вопросы