Обработка числовых массивов средствами NumPy

Раздел: Научные вычисления -> NumPy: анализ данных

Основные приёмы анализа данных с NumPy

Как наиболее эффективно вычислить среднее значение массива?

Использование функции np.mean позволяет получить результат за счёт векторизованных операций на C.

import numpy as np
arr = np.random.rand(1000000)
mean_val = np.mean(arr)
print(mean_val)

Python numpy анализ данных (анализ данных с numpy)

0.4999...

Данный подход работает быстро и не требует циклов.

Проблема: при наличии пропущенных значений (NaN) результат будет NaN. Решение: использовать np.nanmean.

Типичная ошибка: передача одномерного массива с ожиданием многомерной статистики. Параметр axis позволяет указать направление.

Вычисление среднего вручную с помощью цикла

Для сравнения можно вычислить среднее в цикле Python:

total = 0
for val in arr:
    total += val
mean_loop = total / len(arr)
print(mean_loop)

Цикл работает значительно медленнее и неэффективен для больших данных.

Ошибка: если массив пуст, деление на ноль. Следует проверять длину.

Фильтрация данных по условию

Как отобрать элементы, удовлетворяющие критерию?

Булева индексация является быстрым способом:

arr = np.array([1, 2, 3, 4, 5])
filtered = arr[arr > 2]
print(filtered)
[3 4 5]

Ошибка: использование оператора and вместо & для комбинирования условий. and работает только со скалярами.

Обработка пропущенных значений

Как вычислить статистики, игнорируя NaN?

Функции np.nanmean, np.nanstd и другие.

arr_nan = np.array([1, np.nan, 3, 4])
mean_nan = np.nanmean(arr_nan)
print(mean_nan)
2.666...

Ошибка: забыть проверить наличие NaN в данных. Использование обычного np.mean вернёт NaN.

Работа с многомерными массивами

Как выполнить агрегацию по оси?

Параметр axis в функциях.

matrix = np.array([[1, 2], [3, 4]])
col_sum = np.sum(matrix, axis=0)
row_sum = np.sum(matrix, axis=1)
print(col_sum, row_sum)
[4 6] [3 7]

Путаница с направлением оси. Для двумерного массива axis=0 - суммирование по строкам (результат - вектор длины столбца). Рекомендуется проверять на маленьком примере.

Расширенные примеры использования NumPy

Ниже приведены дополнительные сценарии работы с библиотекой.

Пример
import numpy as np

# Создание специальных массивов
zeros = np.zeros((2,3))
ones = np.ones((3,2))
eye = np.eye(4)
print('zeros:', zeros)
print('ones:', ones)
print('eye:', eye)
zeros: [[0. 0. 0.]
 [0. 0. 0.]]
ones: [[1. 1.]
 [1. 1.]
 [1. 1.]]
eye: [[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
Пример
# Использование arange и linspace
seq1 = np.arange(0, 10, 2)
seq2 = np.linspace(0, 1, 5)
print('arange:', seq1)
print('linspace:', seq2)
arange: [0 2 4 6 8]
linspace: [0.   0.25 0.5  0.75 1.  ]
Пример
# Линейная алгебра
A = np.array([[2, 1], [1, 3]])
b = np.array([5, 6])
x = np.linalg.solve(A, b)
print('Решение СЛАУ:', x)

# Умножение матриц
B = np.array([[1, 2], [3, 4]])
C = np.dot(A, B)
print('Произведение матриц:', C)
Решение СЛАУ: [1.8 1.4]
Произведение матриц: [[ 5  8]
 [10 14]]
Пример
# Генерация случайных чисел
np.random.seed(42)
normal = np.random.normal(loc=0, scale=1, size=1000)
uniform = np.random.uniform(0, 10, size=(2,3))
print('Среднее нормального:', normal.mean())
print('Равномерное распределение:', uniform)
Среднее нормального: 0.011...
Равномерное распределение: [[... ... ...]
 [... ... ...]]
Пример
# Изменение формы массива
arr = np.arange(12)
reshaped = arr.reshape((3,4))
flattened = reshaped.ravel()
transposed = reshaped.T
print('Исходный:', arr)
print('Reshape:', reshaped)
print('Flatten:', flattened)
print('Transpose:', transposed)
Исходный: [ 0  1  2  3  4  5  6  7  8  9 10 11]
Reshape: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
Flatten: [ 0  1  2  3  4  5  6  7  8  9 10 11]
Transpose: [[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
Пример
# Булева индексация для замены значений
arr = np.array([10, 20, 30, 40, 50])
arr[arr > 30] = 0
print('После замены:', arr)
После замены: [10 20 30  0  0]
Пример
# Векторизация пользовательской функции
def my_func(x):
    return x * 2 + 1

vec_func = np.vectorize(my_func)
arr = np.array([1, 2, 3])
result = vec_func(arr)
print('Векторизованный результат:', result)
Векторизованный результат: [3 5 7]
Пример
# Агрегация с маской
arr = np.array([1, 2, 3, 4, 5])
mask = arr > 2
mean_masked = np.mean(arr[mask])
print('Среднее по маске:', mean_masked)
Среднее по маске: 4.0
Пример
# Статистики распределения
data = np.random.randn(10000)
percentiles = np.percentile(data, [25, 50, 75])
print('25-й, 50-й, 75-й перцентили:', percentiles)
print('Стандартное отклонение:', np.std(data))
25-й, 50-й, 75-й перцентили: [-0.67... 0.00... 0.67...]
Стандартное отклонение: 1.00...
Пример
# Комбинирование условий
arr = np.array([1, 5, 3, 8, 2])
condition = (arr > 2) & (arr < 7)
print('Элементы между 2 и 7:', arr[condition])
Элементы между 2 и 7: [5 3]
Пример
# Сортировка
arr = np.array([3, 1, 2, 5, 4])
sorted_arr = np.sort(arr)
indices = np.argsort(arr)
print('Отсортированный:', sorted_arr)
print('Индексы сортировки:', indices)
Отсортированный: [1 2 3 4 5]
Индексы сортировки: [1 2 0 4 3]

Анализ данных с NumPy - comments

En
Python numpy анализ данных (python)