Тип object
Тип данных object в NumPy позволяет создавать массивы, элементами которых могут быть любые Python-объекты: числа, строки, списки, словари, функции и даже другие массивы. Вместо хранения самих объектов, массив хранит ссылки на них, что делает такие массивы гибкими, но менее производительными, чем массивы с числовыми типами. В качестве значения dtype достаточно указать object или np.object_.
Основное применение массивов с типом object - это ситуации, когда необходимо собрать разнородные данные в одной структуре или когда данные не могут быть представлены в виде однородных числовых типов.
Синтаксис
np.array(object, dtype=object)
где:
-
object- входные данные (список, кортеж, другой массив) -
dtype=object- явное указание типа данных для хранения произвольных объектов
Пример
Создадим массив с элементами разных типов:
import numpy as np
arr = np.array([1, "text", 3.14, [1, 2]], dtype=object)
print(arr)
Результат выполнения кода:
[1 'text' 3.14 list([1, 2])]
Как видим, массив содержит целое число, строку, число с плавающей точкой и список.
Пример
Создадим массив, содержащий функции и другие массивы:
import numpy as np
arr = np.array([
np.sin,
np.cos,
np.array([1, 2, 3]),
{"a": 1, "b": 2}
], dtype=object)
print(arr)
Результат выполнения кода:
[<ufunc 'sin'> <ufunc 'cos'> array([1, 2, 3]) {'a': 1, 'b': 2}]
Теперь элементы массива - это функции, другой массив и словарь.
Пример
Изменим элемент массива с типом object:
import numpy as np
arr = np.array([10, "hello", 3.14], dtype=object)
arr[1] = "world"
print(arr)
Результат выполнения кода:
[10 'world' 3.14]
Элемент массива успешно заменен на новую строку.
Пример
Выполним математическую операцию с массивом типа object:
import numpy as np
arr = np.array([1, 2, 3, 4], dtype=object)
res = arr * 2
print(res)
Результат выполнения кода:
[2 4 6 8]
Операция умножения применяется поэлементно, как и для числовых массивов. Однако если элементы не поддерживают операцию, возникнет ошибка.
Пример
Сравним производительность массивов с типом object и числового типа:
import numpy as np
import time
size = 1000000
# Array with object type
arr_obj = np.array(range(size), dtype=object)
start = time.time()
res_obj = arr_obj * 2
time_obj = time.time() - start
# Array with int64 type
arr_int = np.array(range(size), dtype=np.int64)
start = time.time()
res_int = arr_int * 2
time_int = time.time() - start
print(f"Object type time: {time_obj:.4f}s")
print(f"Int64 type time: {time_int:.4f}s")
Примерный результат выполнения кода:
"Object type time: 0.0521s"
"Int64 type time: 0.0032s"
Как видно, массивы с типом object работают значительно медленнее, поэтому их следует использовать только при необходимости.