2016-06-29 2 views
1

Мне нужно решить большое количество симметричных, поведенчески определенных систем 3x3 с Python. До сих пор я сделалРешение большого числа небольших линейных систем

res = numpy.zeros(n) 
for k, obj in enumerate(data_array): 
    # construct A, rhs, idx from obj 
    res[idx] += numpy.linalg.solve(A, rhs) 

Это производит правильный результат, однако также довольно медленно, если n велико. (Ну ... да.) Возможно, 3x3 не является проблемой, где вызов solve() имеет смысл.

Любые подсказки?

ответ

4

В NumPy 1.8 и более поздних версиях, numpy.linalg.solve actually broadcasts. Для numpy.linalg.solve(a, b), если b.ndim == a.ndim - 1, он будет выполнять широковещательный матричный вектор; в противном случае это приведет к разрешению широковещательной матричной матрицы. (Этот критерий решение не документированы;. Я должен был смотреть на источник)

Если вы можете эффективно построить стек A с и rhs с, вы можете вызвать solve раз и избежать цикла Python.

+0

Только то, что мне нужно. Благодаря! –

+0

Критерий принятия подразумевается словами 'a: (..., M, M) array_like' и' b: {(..., M,), (..., M, K)} 'в документации, хотя и в несколько загадочной форме. –

+0

@pv .: Не совсем. Например, если бы вы шли по этим фигурам, вы ожидали бы 'a.shape == (5, 5, 5, 5)' и 'b.shape == (5, 5, 4)', чтобы сделать матрицу- и вы ожидаете 'a.shape == (5, 5, 5, 5)' и 'b.shape == (5,)' делать вектор-матрицу, но NumPy выбирает противоположные интерпретации. – user2357112

Смежные вопросы