Функция nancumsum
Функция nancumsum вычисляет кумулятивную сумму элементов массива,
пропуская значения NaN. При встрече с NaN функция сохраняет
предыдущую накопленную сумму без изменений, а затем продолжает суммирование
следующих элементов. Первым параметром функция принимает массив
для вычисления. Вторым параметром можно указать ось для суммирования.
Синтаксис
np.nancumsum(a, axis=None, dtype=None, out=None)
Параметры
a - входной массив, может содержать значения NaN.
axis - ось, вдоль которой вычисляется кумулятивная сумма.
По умолчанию None - массив сглаживается.
dtype - тип данных результирующего массива.
out - альтернативный выходной массив для результата.
Пример
Давайте вычислим кумулятивную сумму для одномерного массива с одним значением NaN:
import numpy as np
arr = np.array([1, 2, np.nan, 4, 5])
res = np.nancumsum(arr)
print(res)
Результат выполнения кода:
[1. 3. 3. 7. 12.]
Значение NaN было пропущено, и сумма продолжила накапливаться с 3 до 7, затем до 12.
Пример
Давайте сравним поведение nancumsum и обычной cumsum при наличии NaN:
import numpy as np
arr = np.array([1, np.nan, 3, 4])
res_nan = np.nancumsum(arr)
res_cum = np.cumsum(arr)
print("nancumsum:", res_nan)
print("cumsum:", res_cum)
Результат выполнения кода:
"nancumsum: [1. 1. 4. 8.]"
"cumsum: [1. nan nan nan]"
Обычная cumsum делает все последующие элементы равными NaN,
тогда как nancumsum продолжает корректно суммировать.
Пример
Давайте применим функцию к двумерному массиву по оси 0 (по столбцам):
import numpy as np
arr = np.array([[1, np.nan, 3],
[4, 5, 6],
[np.nan, 8, 9]])
res = np.nancumsum(arr, axis=0)
print(res)
Результат выполнения кода:
[[1. nan 3.]
[5. 5. 9.]
[5. 13. 18.]]
Для каждой колонки вычисляется накопленная сумма: в первом столбце 1 + 4 = 5,
затем + NaN = 5; во втором столбце NaN + 5 = 5, затем + 8 = 13.
Пример
Давайте вычислим кумулятивную сумму по оси 1 (по строкам):
import numpy as np
arr = np.array([[1, 2, np.nan],
[4, np.nan, 6],
[7, 8, 9]])
res = np.nancumsum(arr, axis=1)
print(res)
Результат выполнения кода:
[[1. 3. 3.]
[4. 4. 10.]
[7. 15. 24.]]
В первой строке сумма накапливается: 1, 1+2=3, затем NaN пропускается,
и сумма остаётся 3. Во второй строке: 4, затем 4 + NaN = 4, затем 4 + 6 = 10.
Пример
Давайте используем параметр dtype для управления типом данных результата:
import numpy as np
arr = np.array([1, 2, np.nan, 4])
res_int = np.nancumsum(arr, dtype=np.int64)
res_float = np.nancumsum(arr, dtype=np.float64)
print("int64:", res_int)
print("float64:", res_float)
Результат выполнения кода:
"int64: [1 3 3 7]"
"float64: [1. 3. 3. 7.]"
Тип результата контролируется через dtype: для целых чисел NaN преобразуется в 0,
для чисел с плавающей точкой сохраняется пропуск значений.
Смотрите также
-
функцию
nansum,
которая вычисляет сумму без учёта NaN -
функцию
nancumprod,
которая вычисляет кумулятивное произведение с игнорированием NaN -
функцию
nanmean,
которая вычисляет среднее арифметическое без учёта NaN -
функцию
isnan,
которая проверяет элементы на NaN