Я хочу изменить плотную квадратную матрицу перехода на месте, изменив порядок нескольких ее строк и столбцов, используя библиотеку NumPy Python. Математически это соответствует предварительному умножению матрицы на матрицу перестановок P и последующему умножению ее на P ^ -1 = P ^ T, но это не является разумным в вычислительном отношении решением.
Прямо сейчас я меняю строки и столбцы вручную, но я ожидал, что у numpy будет хорошая функция f (M, v), где M имеет n строк и столбцов, а v имеет n записей, так что f (M, v) обновляет M в соответствии с перестановкой индекса v. Может быть, я просто не могу найти в Интернете.
Нечто подобное может быть возможно с «продвинутой индексацией» numpy, но, насколько я понимаю, такого решения не будет. Также для некоторых простых ситуаций может быть достаточно просто отдельно отслеживать перестановку индекса, но это не удобно в моем случае.
Добавлено:
Иногда, когда люди говорят о перестановках, они имеют в виду только выборку случайных перестановок, например, как часть процедуры для получения p-значений в статистике. Или они означают подсчет или перечисление всех возможных перестановок. Я не говорю об этих вещах.
Добавлено:
Матрица достаточно мала, чтобы поместиться в оперативной памяти, но достаточно большой, чтобы я не хотел копировать ее бездумно. На самом деле я хотел бы использовать матрицы как можно большего размера, но я не хочу иметь дело с неудобством невозможности удерживать их в ОЗУ, и я выполняю O (N ^ 3) операций LAPACK над матрицей, что также ограничить практический размер матрицы. В настоящее время я копирую такие большие матрицы без необходимости, но я надеюсь, что этого легко избежать при перестановке.
источник
M[v]
переставляет строки.Ответы:
Согласно документации, в numpy нет метода перестановки на месте, что-то вроде ndarray.sort .
Таким образом, ваши варианты (при условии, чтоN×N
M
это матрица и вектор перестановки)p
накладных расходов памятиN
накладные расходы памятиN2
Надеюсь, что эти неоптимальные хаки полезны.
источник
Предупреждение: приведенный ниже пример работает правильно, но использование полного набора параметров, предложенных в конце статьи, приводит к ошибке или, по крайней мере, «недокументированной возможности» в функции numpy.take (). Смотрите комментарии ниже для деталей. Отчет об ошибке подан .
Вы можете сделать это на месте с помощью функции take () numpy , но это требует небольшого количества прыжков.
Вот пример выполнения случайной перестановки строк единичной матрицы:
Чтобы сделать это на месте, все, что вам нужно сделать, это указать параметр "out", который будет таким же, как входной массив, и вы должны установить mode = "clip" или mode = "wrap". Если вы не установите режим, он сделает копию для восстановления состояния массива в исключении Python (см. Здесь) .
В заключение отметим, что take является методом массива, поэтому вместо
ты можешь позвонить
если это больше на ваш вкус. Таким образом, в целом ваш звонок должен выглядеть примерно так:
Чтобы переставить как строки, так и столбцы, я думаю, что вам нужно либо запустить его дважды, либо вытащить несколько уродливых махинаций с numpy.unravel_index, который заставляет меня задуматься.
источник
1.6.2
,test take, not overwriting: True
,test not-in-place take: True
,test in-place take: False
,rr [3, 7, 8, 1, 4, 5, 9, 0, 2, 6]
,arr [30 70 80 70 40 50 90 30 80 90]
,ref [30 70 80 10 40 50 90 0 20 60]
. Так что,np.take
по крайней мере, для numpy 1.6.2 не известно о необходимости перестановки на месте и все портится.Если у вас есть разреженная матрица, сохраненная в
COO
формате, может быть полезно следующееA
COO
perm
numpy.array
источник
C00
матрицы в первую очередь?int
float
float
numpy.ndarray
У меня недостаточно репутации, чтобы комментировать, но я думаю, что следующий вопрос SO может быть полезным: /programming/4370745/view-onto-a-numpy-array
Основные моменты , которые вы можете использовать основные нарезки и создадут представление о к массиву без копирования, но если вы делаете передовые нарезки / индексацию , то это будет создавать копию.
источник
Как насчет
my_array [:, [0, 1]] = my_array [:, [1, 0]]
источник