Итерация по диапазонам, заданным парой целочисленных массивов

Вопрос или проблема

У меня есть многомерный массив $\boldsymbol{A}$ значений, и я хочу вычислить сумму значений для каждого ортогонального диапазона. Ортогональные диапазоны определяются парой «антиподальных» углов $\left(x_0,\,\dots,\,x_{n-1}\right),\left(x_0+c_0,\,\dots,\,x_{n-1}+c_{n-1}\right);\quad x_i,c_i\in \mathbb{N}_0 $

Что я хочу сделать, так это вычислить сумму $\sum\limits_{i_{n-1}=x_{n-1}}^{x_{n-1}+c_{n-1}}\cdots\sum\limits_{i_0=x_{0}}^{x_{0}+c_{0}}\boldsymbol{A}\left[i_0,\,\dots,\,i_{n-1}\right]$, однако более «питоническим» способом в стиле

sum([A[i] for i in range(x,x+c)]) # псевдокод!

Существует ли способ преобразовать вышеупомянутый псевдокод в действительный код на Python с помощью библиотек itertools или numpy?

Ответ или решение

В данной задаче нам нужно вычислить сумму значений в многомерном массиве (матрице) (\boldsymbol{A}) по заданным ортогональным диапазонам, которые определяются парами "антиподальных" углов. Эти углы указаны в виде ((x0, \ldots, x{n-1})) и ((x_0 + c0, \ldots, x{n-1} + c_{n-1})), где (x_i) и (c_i) – неотрицательные целые числа.

Для решения этой задачи мы можем воспользоваться библиотеками numpy и itertools в Python. Ниже приведён пример кода, который реализует указанное выше.

Код:

import numpy as np

def calculate_sum(A, x, c):
    # Преобразуем входные данные в numpy массив для удобства
    A = np.array(A)

    # Определяем границы диапазона
    start_indices = tuple(x)
    end_indices = tuple(x[i] + c[i] for i in range(len(x)))

    # Используем numpy для извлечения подмассива и вычисления суммы
    sub_array = A[tuple(slice(start, end) for start, end in zip(start_indices, end_indices))]

    total_sum = np.sum(sub_array)
    return total_sum

# Пример использования
A = np.random.rand(4, 4)  # Создаем случайный 4x4 массив
x = [1, 1]  # Начальные индексы
c = [2, 2]  # Размеры диапазона по каждому измерению

result = calculate_sum(A, x, c)
print("Сумма значений в заданном диапазоне:", result)

Объяснение:

  1. Импорт библиотек: Мы импортируем numpy, поскольку он отлично подходит для работы с многомерными массивами и операциями над ними.

  2. Определение функции calculate_sum:

    • Функция принимает массив A, начальные индексы x и размеры диапазона c.
    • Преобразуем A в numpy-массив для удобства.
  3. Определение границ диапазона:

    • start_indices определяет границы начала диапазона.
    • end_indices вычисляет границы конца диапазона, учитывая размеры диапазона.
  4. Извлечение подмассива и вычисление суммы:

    • С помощью генератора выражений slice создаем необходимые срезы для каждой размерности.
    • Используем np.sum для вычисления суммы значений извлеченного подмассива.
  5. Пример использования:

    • Создаем случайный 4×4 массив и выбираем диапазон для суммирования.
    • Выводим результат.

Итог:

Таким образом, с помощью numpy мы можем легко и эффективно вычислять сумму значений в многомерных диапазонах. Это решение не только читабельно, но и оптимизировано для работы с большими данными, так как numpy использует векторизированные операции.

Оцените материал
Добавить комментарий

Капча загружается...