#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)) — Индекс кортежа вне диапазона