Функция nancumprod
Функция nancumprod вычисляет кумулятивное произведение элементов массива, игнорируя значения NaN (Not a Number). Кумулятивное произведение - это массив, где каждый элемент равен произведению всех предыдущих элементов включая текущий. В отличие от стандартной функции cumprod, которая при встрече NaN начинает выдавать NaN для всех последующих элементов, nancumprod заменяет NaN на 1 при умножении, что позволяет корректно вычислять произведение остальных элементов. Это особенно полезно при работе с реальными данными, содержащими пропуски, где требуется сохранить непрерывность кумулятивных вычислений.
Синтаксис
np.nancumprod(a, [axis=None], [dtype=None], [out=None])
Параметры:
-
a- входной массив. -
axis(необязательный) - ось, вдоль которой вычисляется кумулятивное произведение. ЕслиNone, массив уплощается перед вычислением. -
dtype(необязательный) - тип данных результата. -
out(необязательный) - массив для сохранения результата.
Возвращаемое значение - массив ndarray с кумулятивным произведением.
Пример с одномерным массивом
Вычислим кумулятивное произведение для массива с пропущенными значениями:
import numpy as np
arr = np.array([1, 2, np.nan, 4, 5])
res = np.nancumprod(arr)
print("Исходный массив:", arr)
print("Кумулятивное произведение (игнорируя NaN):", res)
Результат выполнения кода:
Исходный массив: [ 1. 2. nan 4. 5.]
Кумулятивное произведение (игнорируя NaN): [ 1. 2. 2. 8. 40.]
Значение NaN было заменено на 1 при умножении, что позволило продолжить вычисления: 1 * 2 = 2, 2 * 1 = 2, 2 * 4 = 8, 8 * 5 = 40.
Пример сравнения с cumprod
Сравним поведение nancumprod и стандартной cumprod:
import numpy as np
arr = np.array([1, 2, np.nan, 4, 5])
cumprod_res = np.cumprod(arr)
nancumprod_res = np.nancumprod(arr)
print("Исходный массив:", arr)
print("cumprod (стандартная):", cumprod_res)
print("nancumprod (игнорируя NaN):", nancumprod_res)
Результат выполнения кода:
Исходный массив: [ 1. 2. nan 4. 5.]
cumprod (стандартная): [ 1. 2. nan nan nan]
nancumprod (игнорируя NaN): [ 1. 2. 2. 8. 40.]
Стандартная cumprod после встречи NaN выдает NaN для всех последующих элементов, а nancumprod корректно продолжает вычисления.
Пример с двумерным массивом и осью
Вычислим кумулятивное произведение вдоль разных осей:
import numpy as np
arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]])
res_axis0 = np.nancumprod(arr, axis=0)
res_axis1 = np.nancumprod(arr, axis=1)
print("Исходный массив:")
print(arr)
print("Кумулятивное произведение по столбцам (axis=0):")
print(res_axis0)
print("Кумулятивное произведение по строкам (axis=1):")
print(res_axis1)
Результат выполнения кода:
Исходный массив:
[[ 1. 2. nan]
[ 4. nan 6.]
[nan 8. 9.]]
Кумулятивное произведение по столбцам (axis=0):
[[ 1. 2. nan]
[ 4. 2. 6.]
[ 4. 16. 54.]]
Кумулятивное произведение по строкам (axis=1):
[[ 1. 2. 2.]
[ 4. 4. 24.]
[ 1. 8. 72.]]
При axis=0 произведение вычисляется по столбцам (сверху вниз), при axis=1 - по строкам (слева направо). Везде NaN были заменены на 1 при умножении.
Пример с dtype
Укажем тип данных результата с помощью параметра dtype:
import numpy as np
arr = np.array([1, 2, np.nan, 4, 5])
res = np.nancumprod(arr, dtype=np.float32)
print("Результат с dtype=float32:", res)
print("Тип данных:", res.dtype)
Результат выполнения кода:
Результат с dtype=float32: [ 1. 2. 2. 8. 40.]
Тип данных: float32
Результат был сохранен с указанным типом данных.