Ненужное элементное произведение 3d-массива

У меня есть два 3D-массива A и B с формой (N, 2, 2), которые я хотел бы умножить по элементам в соответствии с осью N с матричным произведением на каждой из матриц 2×2. С реализацией цикла это выглядит

C[i] = dot(A[i], B[i]) 

Есть ли способ сделать это без использования цикла? Я посмотрел на тендердот, но не смог заставить его работать. Я думаю, что мне может понадобиться что-то вроде tensordot(a, b, axes=([1,2], [2,1])) но это дает мне матрицу NxN.

2 Solutions collect form web for “Ненужное элементное произведение 3d-массива”

Кажется, вы делаете матричные умножения для каждого среза вдоль первой оси. Для этого вы можете использовать np.einsum например,

 np.einsum('ijk,ikl->ijl',A,B) 

Проверка времени выполнения и проверка результатов –

 In [179]: N = 10000 ...: A = np.random.rand(N,2,2) ...: B = np.random.rand(N,2,2) ...: ...: def einsum_based(A,B): ...: return np.einsum('ijk,ikl->ijl',A,B) ...: ...: def forloop(A,B): ...: N = A.shape[0] ...: C = np.zeros((N,2,2)) ...: for i in range(N): ...: C[i] = np.dot(A[i], B[i]) ...: return C ...: In [180]: np.allclose(einsum_based(A,B),forloop(A,B)) Out[180]: True In [181]: %timeit forloop(A,B) 10 loops, best of 3: 54.9 ms per loop In [182]: %timeit einsum_based(A,B) 100 loops, best of 3: 5.92 ms per loop 

Вам просто нужно выполнить операцию над первым измерением ваших тензоров, который помечен как 0 :

 c = tensordot(a, b, axes=(0,0)) 

Это будет работать по вашему желанию. Также вам не нужен список осей, потому что это просто одно измерение, которое вы выполняете. С axes([1,2],[2,1]) вы перекрещиваетесь с 2-м и 3-м измерениями. Если вы пишете его в индексной нотации (соглашение суммирования Эйнштейна), это соответствует c[i,j] = a[i,k,l]*b[j,k,l] , таким образом, вы сокращаете индексы, которые вы хотите держать.

EDIT: Хорошо, проблема в том, что тензорное произведение двух 3d-объектов является объектом 6d. Поскольку сокращения связаны с парами индексов, вы не сможете получить 3d-объект с помощью операции tensordot . Трюк состоит в том, чтобы разделить ваш расчет на две части: сначала вы делаете tensordot по индексу для выполнения операции с матрицей, а затем вы берете диагональ тензора, чтобы уменьшить ваш 4d-объект до 3d. В одной команде:

 d = np.diagonal(np.tensordot(a,b,axes=()), axis1=0, axis2=2) 

В тензорной нотации d[i,j,k] = c[i,j,i,k] = a[i,j,l]*b[i,l,k] .

  • Численное умножение матричных U * B * UT Результаты в несимметричной матрице
  • Matplotlib 1.3.1: plot (matrix ("1,2,3")) -> RuntimeError: превышена максимальная глубина рекурсии
  • Быстрый взвешенный расчет матрицы рассеяния
  • Как заставить ndarray показать обычным способом вместо научной нотации?
  • Почему numpy.linalg.solve () предлагает более точные инверсии матрицы, чем numpy.linalg.inv ()?
  • В чем разница между массивами numpy и матрицами? Какой из них я должен использовать?
  • Как проверить, имеет ли матрица в Python только 1 и 0?
  • Python: One-Liner для выполнения операции над элементами в массиве 2d (список списков)?
  • создать матрицу из массива элементов под диагональю в numpy
  • Как определить многомерные массивы в python?
  • Python: изменение размера существующего массива и заполнение нулями
  •  
    Interesting Posts for Van-Lav

    ImportError: No Module Named bs4 (BeautifulSoup)

    Как использовать malloc и бесплатно с python ctypes?

    Python 3 smtplib отправляет с символами unicode

    Ошибка pydot и graphviz: не удалось импортировать dot_parser, загрузка файлов точек будет невозможна

    Как добавить пользовательские параметры в строку запроса URL-адреса с помощью Python?

    Найти целочисленного ближайшего соседа в dict

    Метод разрешения разрешения (MRO) в классах нового стиля?

    Сельдерей: как проигнорировать задачу в аккорде или цепочке?

    Как просмотреть или найти поле One2many в Odoo?

    Установите максимальное количество потоков во время выполнения на numpy / openblas

    Как выполнять вложенные, иерархические пассивные многопроцессорные карты?

    Python: Как передать переменные между экземплярами класса или получить вызывающего?

    Open () и codecs.open () в Python 2.7 ведут себя странно

    Python: как я могу проверить, имеет ли объект тип datetime.date?

    Извлечение текста из XML с помощью python

    Python - лучший язык программирования в мире.