Передача значений в функцию с помощью numpy

#python #function #numpy

#python #функция #numpy

Вопрос:

Предположим, у меня есть функция, которая имеет три входных параметра prob (x, mu, sig). С размерами:

 x = 1 x 3
mu = 1 x 3
sig = 3 x 3
  

Теперь у меня есть набор данных X, средняя матрица M и std. матрица отклонений сигма.
Размеры:-

 X : m x 3.
mean :  k x 3. 
sigma :  k x 3 x 3
  

Для каждого значения m я хочу передать все значения k в задаче функции, чтобы вычислить значение моей ответственности.

Я могу передавать значения одно за другим, используя циклы for. Какой был бы лучший способ сделать это в numpy.

Соответствующий код для справки:

 responsibility = np.zeros((X.shape[0],k))
    s = np.zeros(k)
    for i in np.arange(X.shape[0]):
        for j in np.arange(k):
            s[j] = prob(X[i],MU[j],SIGMA[j])
        s = s/s.sum()
        responsibility[i] = s
    responsibility = np.transpose(responsibility)
  

Комментарии:

1. пожалуйста, предоставьте пример кода, в котором вы показываете, как вы его реализуете в настоящее время

2. Только что добавлен раздел кода. Пожалуйста, проверьте

Ответ №1:

Если использование одного цикла for приемлемо, то вы, вероятно, можете использовать следующее,

 import itertools

sigma.shape = k, 9
zipped_array = np.array(list(zip(mean, sigma)))
all_possible_combo = list(itertools.product(X, zipped_array))
list_len = len(all_possible_combo) # = m * k
s = np.zeros(k)
responsibility = np.zeros((X.shape[0],k))
for i in range(list_len):
    X_arow = all_possible_combo[i][0]
    mean_single = all_possible_combo[i][1]
    sigma_single = all_possible_combo[i][2].reshape((3, 3))
    s = prob(X_arow, mean_single, sigma_single)
    s = s/s.sum()
    responsibility[i] = s
responsibility = np.transpose(responsibility)
  

Комментарии:

1. Пожалуйста, проверьте сейчас

2. Похоже, не работает. Для строки: zipped_array = np.array(список(zip (среднее значение, сигма))) выдает следующую ошибку: Не удалось выполнить широковещательную передачу из формы (3,3) в 3

3. Как насчет сейчас?

4. в строке: sigma_single = all_possible_combo[i][2].изменить форму((3, 3)) — Индекс кортежа вне диапазона