numpy.char.chararray.view#

方法

char.chararray.view([dtype][, type])#

数组的新视图,与原始数据相同。

注意

dtype 传递 None 与省略该参数不同,因为前者会调用 dtype(None),它是 dtype('float64') 的别名。

参数:
dtype数据类型或 ndarray 子类,可选

返回视图的数据类型描述符,例如 float32 或 int16。省略此参数将使视图具有与 a 相同的数据类型。此参数也可以指定为 ndarray 子类,此时它指定返回对象的类型(这等同于设置 type 参数)。

typePython 类型,可选

返回视图的类型,例如 ndarray 或 matrix。同样,省略此参数将保留原类型。

说明

a.view() 有两种不同的用法

a.view(some_dtype)a.view(dtype=some_dtype) 会构造一个具有不同数据类型的数组内存视图。这可能导致内存字节的重新解释。

a.view(ndarray_subclass)a.view(type=ndarray_subclass) 仅返回一个 ndarray_subclass 的实例,该实例指向相同的数组(相同的形状、数据类型等)。这不会导致内存的重新解释。

对于 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)])

使用不同的类型和数据类型查看数组数据

>>> 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')])

使用视图将数组转换为记录数组

>>> 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')])

通常应避免在由切片、转置、Fortran 顺序等定义的数组上使用更改数据类型大小(每个条目的字节数)的视图。

>>> 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', '<i2'), ('length', '<i2')])

然而,对于最后一个轴连续的数组,即使其他轴不是 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)