Обработка числовых массивов средствами 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]