В настоящее время я пытаюсь векторизовать свой код, чтобы уменьшить время его обработки, и при попытке произошла ошибка трансляции.

У меня есть два вектора, TDOA_values с формой (200,) и __frequency_bins__ с формой (257,).

Теперь я хочу использовать элементы этих векторов, чтобы заполнить мою «пустую» матрицу temp_gcc_results который определяется как: temp_gcc_results = np.zeros((len(TDOA_values), len(__frequency_bins__))) этот массив имеет форму (200, 257).

Теперь я пытаюсь заполнить каждую ячейку temp_gcc_results, рассчитав следующую формулу для каждого элемента TDOA_values для каждого элемента __frequency_bins__:

temp_gcc_results[:, :] = (Rxx12/abs(Rxx12) * np.exp(-2j * np.pi * TDOA_values * __frequency_bins__)).real

К сожалению, выполнение этого кода приводит к этой ошибке:

operands could not be broadcast together with shapes (200,) (257,) 

Моя проблема сейчас в том, что я не понимаю, почему Python пытается передать вместо замены нулей значениями из формулы.

Спасибо за помощь!

2
0xDr0id 2 Янв 2020 в 19:22

1 ответ

Лучший ответ

Вам необходимо использовать np.newaxis:

# array(m x n) = array(m x 1) * array(1 x n)

import numpy as np
Rxx12 = 1 # TODO, not specified in the question
TDOA_values = np.random.random(200)
__frequency_bins__ = np.random.random(257)
temp_gcc_results = np.zeros((len(TDOA_values), len(__frequency_bins__)))
temp_gcc_results[:, :] = (Rxx12/abs(Rxx12) * np.exp(-2j * np.pi * TDOA_values[:, np.newaxis] * __frequency_bins__[np.newaxis, :])).real

# You actually don"t need to initialize *temp_gcc_results* in your case
temp_gcc_results = (Rxx12/abs(Rxx12) * np.exp(-2j * np.pi * TDOA_values[:, np.newaxis] * __frequency_bins__[np.newaxis, :])).real

Ваша ошибка возникает здесь, при умножении двух массивов с несовпадающими формами:

TDOA_values * __frequency_bins__

Не при присвоении результата:

temp_gcc_results[:, :] 
1
scleronomic 2 Янв 2020 в 19:37