numpy.ndarray.view#
метод
- ndarray.представление([dtype][, тип])#
Новое представление массива с теми же данными.
Примечание
Передача None для
dtypeотличается от пропуска параметра, поскольку первый вариант вызываетdtype(None)который является псевдонимом дляdtype('float64').- Параметры:
- dtypeтип данных или подкласс ndarray, необязательный
Дескриптор типа данных возвращаемого представления, например, float32 или int16. Если опустить, представление будет иметь тот же тип данных, что и a. Этот аргумент также может быть указан как подкласс ndarray, который затем определяет тип возвращаемого объекта (это эквивалентно установке
typeпараметр).- типТип Python, опционально
Тип возвращаемого представления, например, ndarray или matrix. Опять же, пропуск параметра приводит к сохранению типа.
Примечания
a.view()используется двумя разными способами:a.view(some_dtype)илиa.view(dtype=some_dtype)создает представление памяти массива с другим типом данных. Это может привести к переинтерпретации байтов памяти.a.view(ndarray_subclass)илиa.view(type=ndarray_subclass)просто возвращает экземпляр ndarray_subclass который смотрит на тот же массив (та же форма, dtype и т.д.). Это не вызывает переинтерпретации памяти.Для
a.view(some_dtype), еслиsome_dtypeимеет разное количество байтов на запись, чем предыдущий тип данных (например, преобразование обычного массива в структурированный массив), тогда последняя осьaдолжен быть непрерывным. Эта ось будет изменена в результате.Изменено в версии 1.23.0: Только последняя ось должна быть непрерывной. Ранее весь массив должен был быть C-непрерывным.
Примеры
>>> import numpy as np >>> x = np.array([(-1, 2)], dtype=[('a', np.int8), ('b', np.int8)])
Просмотр данных массива с использованием другого типа и dtype:
>>> nonneg = np.dtype([("a", np.uint8), ("b", np.uint8)]) >>> y = x.view(dtype=nonneg, type=np.recarray) >>> x["a"] array([-1], dtype=int8) >>> y.a array([255], dtype=uint8)
Создание представления на структурированном массиве, чтобы его можно было использовать в вычислениях
>>> x = np.array([(1, 2),(3,4)], dtype=[('a', np.int8), ('b', np.int8)]) >>> xv = x.view(dtype=np.int8).reshape(-1,2) >>> xv array([[1, 2], [3, 4]], dtype=int8) >>> xv.mean(0) array([2., 3.])
Изменение представления изменяет исходный массив
>>> xv[0,1] = 20 >>> x array([(1, 20), (3, 4)], dtype=[('a', 'i1'), ('b', 'i1')])
Использование представления для преобразования массива в recarray:
>>> z = x.view(np.recarray) >>> z.a array([1, 3], dtype=int8)
Представления используют общие данные:
>>> x[0] = (9, 10) >>> z[0] np.record((9, 10), dtype=[('a', 'i1'), ('b', 'i1')])
Представления, изменяющие размер dtype (байт на запись), обычно следует избегать для массивов, определённых срезами, транспонированием, фортран-упорядочением и т.д.:
>>> x = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int16) >>> y = x[:, ::2] >>> y array([[1, 3], [4, 6]], dtype=int16) >>> y.view(dtype=[('width', np.int16), ('length', np.int16)]) Traceback (most recent call last): ... ValueError: To change to a dtype of a different size, the last axis must be contiguous >>> z = y.copy() >>> z.view(dtype=[('width', np.int16), ('length', np.int16)]) array([[(1, 3)], [(4, 6)]], dtype=[('width', '
Однако представления, изменяющие dtype, полностью допустимы для массивов с непрерывной последней осью, даже если остальные оси не являются C-непрерывными:
>>> x = np.arange(2 * 3 * 4, dtype=np.int8).reshape(2, 3, 4) >>> x.transpose(1, 0, 2).view(np.int16) array([[[ 256, 770], [3340, 3854]], [[1284, 1798], [4368, 4882]], [[2312, 2826], [5396, 5910]]], dtype=int16)