Нашли ошибку?
базовыйNumPy 2.5.3

Частые ошибки

Двенадцать ошибок, которые чаще всего встречаются в коде с NumPy, — и как их исправить.

Содержание статьи

Каждая ошибка показана парой: как не надо и как надо. Подробности — в статье по ссылке.

Данные для примеровиспользуются во всех примерах ниже
a = np.array([1, 2, 3])
b = np.array([1, 2, 3])
temps = np.array([3.0, -2.0, np.nan, 8.0])

Массив в условии if

a == b возвращает массив, а не одно значение. → Сравнение массивов

Неправильноошибка: ValueError
if a == b:
    print("равны")
Ошибка
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Правильно
if np.array_equal(a, b):
    print("равны")
Вывод
равны

and / or вместо & / |

С массивами работают только &, |, ~, а каждое условие берётся в скобки. → Булевы маски

Неправильноошибка: ValueError
temps[(temps > 0) and (temps < 5)]
Ошибка
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Правильно
temps[(temps > 0) & (temps < 5)]
Вывод
array([3.])

Изменение среза меняет исходный массив

Срез — представление, а не копия. → Представления и копии

Неправильно
first_two = a[:2]
first_two[0] = 100           # хотели изменить только копию
a
Вывод
array([100,   2,   3])
Правильно
first_two = a[:2].copy()
first_two[0] = 100
a
Вывод
array([1, 2, 3])

result = a.sort()

Метод сортирует на месте и возвращает None. → Сортировка

Неправильно
result = a.sort()
print(result)
Вывод
None
Правильно
result = np.sort(np.array([3, 1, 2]))
result
Вывод
array([1, 2, 3])

Поиск NaN через ==

→ NaN и бесконечности

Неправильно
temps[temps == np.nan]       # пусто: NaN не равен ничему
Вывод
array([], dtype=float64)
Правильно
temps[np.isnan(temps)]
Вывод
array([nan])

Переполнение маленьких целых типов

Арифметика не проверяет выход за пределы типа. → Типы данных

Неправильно
pixels = np.array([200, 100], dtype=np.uint8)
pixels + 100                 # 300 не помещается в uint8
Вывод
array([ 44, 200], dtype=uint8)
Правильно
pixels = np.array([200, 100], dtype=np.uint8)
pixels.astype(np.int64) + 100
Вывод
array([300, 200])

Вектор (n,) вместо столбца (n, 1)

Для квадратной матрицы ошибки нет, но результат неверный. → Транслирование

Неправильно
m = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0],
              [7.0, 8.0, 9.0]])
m - m.mean(axis=1)           # ошибки нет, но вычтено по столбцам
Вывод
array([[-1., -3., -5.],
       [ 2.,  0., -2.],
       [ 5.,  3.,  1.]])
Правильно
m = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0],
              [7.0, 8.0, 9.0]])
m - m.mean(axis=1, keepdims=True)
Вывод
array([[-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.]])

Дробное значение в целом массиве

При записи значение приводится к типу массива. → Типы данных

Неправильно
counts = np.array([1, 2, 3])
counts[0] = 2.7              # дробная часть молча отброшена
counts
Вывод
array([2, 2, 3])
Правильно
counts = np.array([1, 2, 3], dtype=float)
counts[0] = 2.7
counts
Вывод
array([2.7, 2. , 3. ])

Форма без скобок

→ Создание массивов

Неправильноошибка: TypeError
np.zeros(2, 3)
Ошибка
TypeError: Cannot interpret '3' as a data type
Правильно
np.zeros((2, 3))
Вывод
array([[0., 0., 0.],
       [0., 0., 0.]])

Функции math для массивов

→ Универсальные функции

Неправильноошибка: TypeError
import math
math.sqrt(np.array([4.0, 9.0]))
Ошибка
TypeError: only 0-dimensional arrays can be converted to Python scalars
Правильно
np.sqrt(np.array([4.0, 9.0]))
Вывод
array([2., 3.])

Разное std в NumPy и pandas

→ Статистика

Неожиданно
np.std(np.array([2.0, 4.0, 6.0]))            # ddof=0, а pandas даст другое число
Вывод
np.float64(1.632993161855452)
Как в pandas
np.std(np.array([2.0, 4.0, 6.0]), ddof=1)    # как Series.std() в pandas
Вывод
np.float64(2.0)

Цикл вместо операции над массивом

Цикл Python по элементам и np.vectorize в десятки раз медленнее векторных операций. Перепишите через np.where, np.select, агрегации с axis и транслирование. → Векторизация