2014-11-18 6 views
2

, когда мы имеем:скалярного произведения подмассивов без цикла

array 1: A, shape (49998,3,3) 
array 2: B, shape (3, 49998) 

и я хочу, чтобы умножить свои подмассива получить

array 3: C, shape(3,49998) 

, для которого им с помощью генератора:

def genC(A,B): 
    for a,b in itertools.izip(A,B.T): 
     c=np.dot(a,b) 
     yield c.T[0] 

C=np.array([c for c in genC()]).T 

так как я могу сделать внутреннее умножение массивов A, B без цикла для получения массива C?

я пытался использовать np.tensordot, но я не могу получить его

Примечание:

это только простой пример, для некоторых тестов сов в первоначально данных я имел

4 * 3 * 37 массивов а (500 000,3,3) в (3500 000)

делать, и для SEMS петель для меня не вещий способ XD

ответ

4

Если я получу ваш код правильно, вы хотите выполнить 49998 точечных произведений матрицы 3x3 с 3-мя векторами, верно? Это очень легко сделать с np.einsum:

np.einsum('ijk,ki->ij', A, B) 
+0

работает отлично, быстро и эффективно! кажется, что я должен проверить, что einsum и подобные функции, так что, возможно, я убью больше за циклы xD –

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