Мне нужно решить линейную задачу Ax = b
, получив x
методом наименьших квадратов. Все элементы x
должны быть неотрицательными, поэтому я использую scipy.optimize.nnls
(документация здесь).
Проблема в том, что мне нужно много раз решать эту задачу с одной матрицей A
и множеством векторов b
. У меня есть 3d numpy ndarray
, в котором векторы вдоль оси 0
являются векторами b
, а две другие оси соответствуют точкам в пространстве. Я хочу вывести все x
векторов в соответствующий массив, чтобы сохранить пространственную информацию для каждого ответа.
Первый проход по проблеме выглядит так:
A = np.random.rand(5,3)
b_array = B = np.random.rand(5,100,100)
x_array = np.zeros((3,100,100))
for i in range(100):
for j in range(100):
x_array[:,i,j] = sp.optimize.nnls(A, b_array[:,i,j])[0]
Этот код вполне функционален, но кажется совершенно неэлегантным. Что еще более важно, он, вероятно, будет чрезмерно медленным (мой фактический код использует очень большие наборы данных и тысячи раз зацикливается со случайными изменениями параметров, поэтому важна эффективность).
Некоторое время назад я задал этот очень похожий вопрос о поэлементном умножении матриц . Меня познакомили с np.einsum
, который оказался чрезвычайно полезным во многих ситуациях. Я надеялся, что будет аналогичная функция для решения методом наименьших квадратов, но ничего не смог найти. Если кто-нибудь знает о функции, которая может работать, или об альтернативном подходе к эффективному / питоническому решению этой проблемы, это было бы очень признательно!