2016-05-26 2 views
0

У меня есть два Numpy массива:Быстрое внешнее тензорное произведение в NumPy

x of shape ((d1,...,d_m)) 
y of shape ((e_1,...e_n)) 

Я хотел бы, чтобы сформировать внешнее тензорное произведение, то есть Numpy массива

z of shape ((d1,...,d_m,e_1,...,e_n)) 

таким образом, что

z[i_1,...,i_n,i_{n+1}...,i_{m+n}] == x[i_1,...i_m]*y[i_{m+1},...,i_{m+n}] 

Я должен выполнить вышеупомянутое внешнее умножение несколько раз, поэтому я хотел бы ускорить это как можно больше.

+0

вставьте фиктивные данные с ожидаемым результатом, чтобы лучше понять, что вы имеете в виду. –

ответ

2

Альтернативой outer является явно расширить размеры. Для 1d массивов это будет

x[:,None]*y # y[None,:] is automatic. 

Для 10х10 массивов и обобщающее расширения размерности, я получаю те же времена

In [74]: timeit x[[slice(None)]*x.ndim + [None]*y.ndim] * y 
10000 loops, best of 3: 53.6 µs per loop 

In [75]: timeit np.multiply.outer(x,y) 
10000 loops, best of 3: 52.6 µs per loop 

Так outer делает сэкономить кодирование, но основное транслировались умножение такого же ,

4

Вы хотите np.multiply.outer:

z = np.multiply.outer(x, y) 
+0

Вот и все! Правильно ли я предполагаю, что, поскольку ufunc является частью numpy, он называет код C, и не будет значительно более быстрый способ сделать это? – fact

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