Я ищу эффективный способ (желательно векторная быстрая встроенная функция), чтобы сгладить массив numpy в диагональном порядке. Например:Есть ли способ сгладить массив numpy в диагональном порядке эффективно?
A=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
b=flatten_diagonally(A)
b
должен быть [7,4,8,1,5,9,2,6,3]
.
A
будет очень большой матрицей, поэтому я не хочу перебирать элементы по отдельности. По той же причине я также не хочу заранее составлять список всех индексов в правильном порядке. Поскольку A
большой, и результат будет таким же большим, я бы хотел избежать решений, которые используют много памяти дополнительно.
Было бы еще лучше, если бы я мог указать, какое подмножество диагоналей я хотел бы сгладить, например. сплющивание только 1-й и 2-й диагоналей даст [1,5,9,2,6]
.
Вы должны либо итерации или использовать фантазии индексации. Это непересекающийся кусочек, поэтому нет никакого способа сделать это с помощью «обычной» нарезки. С фантастическим индексированием вам нужно заранее подготовить массив индексов. Таким образом, это, вероятно, лучше всего решить путем итерации. 'numpy.fromiter' часто полезен здесь, если вы хотите избежать копирования в памяти. –
Что было сказано, посмотрите на 'scipy.sparse.dia_matrix' и' scipy.sparse.spdiags'. Один из способов добиться того, что вы хотите, - временно преобразовать вещи в 'scipy.sparse.dia_matrix', но это не будет эффективно для памяти для плотной матрицы. –
@JoeKington Спасибо, к сожалению, я так и думал. Я знаю, что это не смежно, но я надеялся, что может быть функция numpy, жестко закодированная на C, чтобы он мог получить доступ к этим элементам быстрее, чем просто индивидуальный доступ через Python, но я думаю, что такой вещи нет. – Bitwise