Создание матрицы numpy с NaN вместо нулей: простые методы
Быстрый ответ
Если вам необходимо создать матрицу NumPy, полностью заполненную np.nan, наиболее удобным будет использование функции np.full():
import numpy as np
nan_matrix = np.full((3, 3), np.nan)
Результат: В итоге мы получаем матрицу размером 3 на 3, где каждый элемент — это nan.

Сравнение производительности:
Применение np.full()
Функция np.full() характеризуется простым использованием и высокой эффективностью:
nan_matrix = np.full((1000, 1000), np.nan)
Более эффективный подход с помощью np.empty().fill()
При работе с большими данными, если требуется максимальная производительность, стоит применить комбинацию np.empty().fill(). Например:
nan_matrix = np.empty((1000, 1000))
nan_matrix.fill(np.nan)
Данная операция выполняется на месте и возвращает None, изменяя при этом исходную матрицу.
Сравнение производительности: Бенчмаркинг
Кто быстрее: np.full() или np.empty().fill()?
import numpy as np
import timeit
setup = "import numpy as np"
stmt1 = "nan_matrix = np.full((500,500), np.nan)"
stmt2 = """
nan_matrix = np.empty((500,500))
nan_matrix.fill(np.nan)
"""
print(timeit.timeit(setup=setup, stmt=stmt1)) # Время выполнения np.full()
print(timeit.timeit(setup=setup, stmt=stmt2)) # Время выполнения np.empty().fill()
При работе с матрицами большого размера np.empty().fill() обычно работает быстрее, но этот момент рекомендуется проверить самостоятельно, запустив код.
Создание матриц NaN: Дополнительные варианты
Функция для создания пользовательской матрицы NaN
Создайте свою функцию для генерации пользовательских матриц NaN — это удобно для решения ваших уникальных задач. Параметр shape определяет размерность матрицы, а dtype=float — тип данных.
def create_nan_matrix(shape, dtype=float):
nan_matrix = np.empty(shape, dtype)
nan_matrix.fill(np.nan)
return nan_matrix
Сравнение nan_matrix[:] = np.nan и nan_matrix.fill(np.nan)
Если вам приходит мысль установить весь набор элементов матрицы как np.nan, учтите, что nan_matrix.fill(np.nan) обычно является более эффективным способом, так как изменение происходит на более низком уровне, напрямую с самим объектом.
Визуализация
Представьте холст, который художник только что начал заполнять, и пока он пуст, но полон возможностей:
До: [🖌️, 🖌️, 🖌️]
Создаем аналогичное пространство в NumPy, но вместо краски используем NaN:
canvas = np.full((rows, cols), np.nan)
После: [🈳, 🈳, 🈳]
Теперь у вас есть равномерно заполненная NaN-ами матрица NumPy, готовая к творческим экспериментам.
Работа с NumPy: Советы профессионала
np.full(): Скорее всего, вам понравится этот подход!
np.full() доступна начиная с версии NumPy 1.8 и станет отличной находкой для тех, кто еще не знаком с древними методами. Эта функция должна быть доступной всем.
Можем умножать единицы на np.nan, потому что так можно
Еще один необычный, но возможный вариант — это создание массива единиц с последующим умножением на np.nan.
nan_matrix = np.ones((3,3)) * np.nan
Не самый эффективный метод, но может быть полезным в случаях, когда больше важна читаемость кода.
Остерегайтесь типов данных!
Работать с NaN лучше всего, используя тип данных float64. Если попытаться использовать другие типы, это может привести к ошибкам. NaN по умолчанию относятся к типу данных float64 в NumPy.
Заглядывайте под капот
Чтение документации NumPy и общение в сообществах помогут улучшить вас в понимании реализации функций и совершенствовании Вашего мастерства работы с матрицами NumPy.
Полезные материалы
- numpy.full — Документация NumPy v1.26 — официальная документация NumPy по созданию массивов, заполненных любыми значениями, включая
NaN. - python – Создание матрицы numpy, заполненной NaNами – Stack Overflow — обсуждения на Stack Overflow, где приводятся практические примеры и решения по созданию матриц NaN в NumPy.
- Быстрый старт с NumPy — Документация NumPy v1.26 — полезное руководство для начинающих, описывающее основные операции с массивами, которые нужно усвоить для успешной работы с матрицами.
- python – Замена значений NaN в массиве NumPy на среднее по столбцам – Stack Overflow — здесь обсуждаются вопросы, связанные с обработкой значений NaN после их создания, что может быть полезно, хотя и является не совсем темой нашей статьи.


