Как я могу преобразовать forloop в единственную операцию Numpy? - PullRequest
0 голосов
/ 29 сентября 2019

Хочу улучшить скорость расчета.У меня есть этот код:

for index_subsequence in range(number_of_sequences):
     sequence = sequences[index_sequence]
     multiplication = np.multiply(sequence, matrix)

Давайте использовать конкретные размеры:

"матрица" имеет форму (2207, 12).

"последовательности" имеет формуиз (1884, 12).Следовательно, «последовательность» - это вектор - вектор с 12 записями.

np.multiply (последовательность, матрица) дает другую (2207, 12) матрицу, где каждая строка умножается на «последовательность».

Код работает правильно, но я хочу избавиться от цикла for.

Мне нужен новый 3D-массив «умножения», имеющий форму (number_of_sequence, 2207, 12).

multiplications[0] = np.multiply(sequences[0], matrix)
multiplications[1] = np.multiply(sequences[1], matrix)

1 Ответ

1 голос
/ 29 сентября 2019

Вот как вы можете это сделать

  • одно измерение добавлено к seq и матрице, чтобы сделать его 3d
  • правило вещания работает следующим образом
  • mat2 имеет 1-еdim empty, поэтому он будет повторен для соответствия 1-му dim из seq2
  • seq2 имеет 2-й dim пустой, поэтому он будет повторяться для соответствия 2-му dim из mat2
import numpy as np

seq = np.eye(3, 3)
matrix = np.arange(4*3).reshape(4,3)

seq2 = seq[:, np.newaxis, :]
mat2 = matrix[np.newaxis, :, :]

result = seq2 * matrix

print(seq)
print(matrix)
print(result)

Результат

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]


[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


[[[ 0.  0.  0.]
  [ 3.  0.  0.]
  [ 6.  0.  0.]
  [ 9.  0.  0.]]

 [[ 0.  1.  0.]
  [ 0.  4.  0.]
  [ 0.  7.  0.]
  [ 0. 10.  0.]]

 [[ 0.  0.  2.]
  [ 0.  0.  5.]
  [ 0.  0.  8.]
  [ 0.  0. 11.]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...