Создайте новую матрицу с суммой всех подматриц n*n без использования циклов

У меня есть начальный массив (а), и я использую циклы для создания новой матрицы (б), где каждый элемент представляет собой сумму каждого уникального подмассива n*n (0+1+5+6=12, 1+2+ 6+7=16, ...). Могу ли я добиться того же результата без использования циклов с помощью встроенных методов Numpy? Я попробовал np.reshape, но не могу посчитать с его помощью пересекающиеся подмассивы.

Код с использованием циклов:

import numpy as np
a = np.array([[ 0,  1,  2,  3, 4], [5,  6,  7,  8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [15, 16, 17, 18, 20]])
n = 2

b = np.empty([0, np.size(a[0])-n+1], int)
for row in range(0, np.size(a[0])-n+1):
    temp_list = []
    for col in range(0, np.size(a[0])-n+1):
        temp_list.append(np.sum(a[row:row+n, col:col+n]))
    b = np.vstack([b, [np.array(temp_list)]])
    
print('Input (a):')
print(a)
print('Output (b):')
print(b)

Результат:

Input (a):
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [15 16 17 18 20]]
Output (b):
[[12 16 20 24]
 [32 36 40 44]
 [52 56 60 64]
 [62 66 70 75]]
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

По сути, это двумерная свертка с квадратным фильтром:

import numpy as np
from scipy.signal import convolve2d

a = np.array([[ 0,  1,  2,  3, 4], [5,  6,  7,  8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [15, 16, 17, 18, 20]])
n = 2

f = np.ones((n,n))

convolve2d(a, f, mode='valid')

выход:

array([[12., 16., 20., 24.],
       [32., 36., 40., 44.],
       [52., 56., 60., 64.],
       [62., 66., 70., 75.]])

Если вас волнует целочисленный вывод, просто используйте его f = np.ones((n,n), dtype=int)

Спасибо! Есть ли способ сделать то же самое, используя только numpy?

yan 19.08.2024 12:32

Если вы хотите сделать все это с помощью numpy, вы можете использовать скользящий_оконный_вид , например,

a = np.array([[ 0,  1,  2,  3, 4], [5,  6,  7,  8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [15, 16, 17, 18, 20]])
n = 2

x = np.lib.stride_tricks.sliding_window_view(a, (n, n))
x = x.reshape(x.shape[0:2] + (-1,))  # flatten last two dimensions
x = np.sum(x, axis=-1)  # sum final dimension

print(x)
[[12 16 20 24]
 [32 36 40 44]
 [52 56 60 64]
 [62 66 70 75]]

Другие вопросы по теме

Как создать случайную сложную симметричную унитарную матрицу в Python?
Могу ли я заменить имя массива на переменную и добавить к ней значение?
Есть ли в массивах NumPy синтаксис для установки значения в последнем измерении на основе первого измерения?
Как создать массив из определенных частей данных JSON?
Уменьшите двухмерный массив истории изменений до начальных и конечных значений для каждого идентификатора и удалите строки, в которых нет изменений
C++ Существует ли быстрый многомерный массив, который позволяет использовать подмассивы разного размера?
PowerShell — наиболее эффективный способ создания массива/списка массивов/pscustomobject
Сжатие массива элементов при уменьшении размера каждого элемента с 8 бит до 3 бит
Как отсортировать массив объектов сам по себе на основе свойства указанного объекта?
Ошибка в cv2.rectangle после переворота изображения с нарезкой: «Макет выходного массива img несовместим с cv::Mat»