numpy.memmap.view#
方法
- memmap.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
的每个条目字节数与之前的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')])
使用视图将数组转换为记录数组 (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')])
更改数据类型大小(每个条目的字节数)的视图通常应避免用于由切片、转置、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)