В настоящее время я использую приведенный ниже код, чтобы удалить подматрицу с i-й строкой и j-м столбцом, но после профилирования моего кода это, по-видимому, является одним из основных узких мест в моем коде. Есть ли более эффективный способ?numpy более эффективная подматрица
def submatrix(A, i, j):
logger.debug('submatrix(%r, %r, %r)', A, i, j)
B = empty(shape=tuple(x - 1 for x in A.shape), dtype=int)
B[:i, :j] = A[:i, :j]
B[i:, :j] = A[i+1:, :j]
B[:i, j:] = A[:i, j+1:]
B[i:, j:] = A[i+1:, j+1:]
return B
25015049 function calls (24599369 primitive calls) in 44.587 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
3983040 15.541 0.000 20.719 0.000 defmatrix.py:301(__getitem__)
415680 10.216 0.000 33.069 0.000 hill.py:127(submatrix)
415686/6 3.232 0.000 44.578 7.430 hill.py:112(det)
Edit: Jaime предоставил хороший способ аппроксимировать модульные инверсий с использованием регулярных обратной и детерминанта, однако с большими базами (по модулю 256 в моем случае), неточность достаточно, чтобы оказать всю вещь спорным. Основное время раковина оказывается на самом деле быть GetItem в NumPy, но я считаю, что это вызван этими линиями:
B[:i, :j] = A[:i, :j]
B[i:, :j] = A[i+1:, :j]
B[:i, j:] = A[:i, j+1:]
B[i:, j:] = A[i+1:, j+1:]
Это возможно бутылочное горлышко не копируя матрицы вокруг в памяти, но доступ матричного элемента ,
Как @Bitwise указывает в своем ответе, не так много скорость до быть получена в движущейся памяти вокруг. Вы можете сделать как минимум на 25% меньше перетасовки данных, выполнив операцию на месте, это вариант? Кроме того, для чего вам нужна эта подматрица? Может быть проще изменить код с помощью подматриц, чтобы игнорировать соответствующую строку и столбец, чем фактически удалить их. – Jaime
Можно ли создать представление подматрицы? Мне не нужна копия подматрицы, но я не уверен, что можно произвольно нарезать матрицу, поскольку я не знаком с numpy. – darkfeline
Вообще нет, вы не можете взглянуть на подматрицу. Что вы делаете с подматрицей потом? – Jaime