原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.view.html
校对:(虚位以待)
ndarray.
view
(dtype=None, type=None)数组的新视图与相同的数据。
参数: | dtype:data-type或ndarray子类,可选
type:Python类型,可选
|
---|
笔记
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
每个条目具有与先前dtype不同的字节数(例如,将常规数组转换为结构化数组)那么视图的行为不能仅从a
(由print(a)
显示)的表面外观预测。它还取决于如何将a
存储在存储器中。因此,如果a
是C有序对有序的,相对于定义为切片或转置等,视图可以给出不同的结果。
例子
>>> x = np.array([(1, 2)], dtype=[('a', np.int8), ('b', np.int8)])
使用不同的类型和dtype查看数组数据:
>>> y = x.view(dtype=np.int16, type=np.matrix)
>>> y
matrix([[513]], dtype=int16)
>>> print(type(y))
<class 'numpy.matrixlib.defmatrix.matrix'>
在结构化数据组上创建视图,以便可以在计算中使用
>>> 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
>>> print(x)
[(1, 20) (3, 4)]
使用视图将数组转换为recarray:
>>> z = x.view(np.recarray)
>>> z.a
array([1], dtype=int8)
查看共享数据:
>>> x[0] = (9, 10)
>>> z[0]
(9, 10)
通常在切片,转置,强制排序等定义的数组上避免改变dtype大小(每个条目的字节数)的视图。:
>>> x = np.array([[1,2,3],[4,5,6]], dtype=np.int16)
>>> y = x[:, 0:2]
>>> y
array([[1, 2],
[4, 5]], dtype=int16)
>>> y.view(dtype=[('width', np.int16), ('length', np.int16)])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: new type not compatible with array.
>>> z = y.copy()
>>> z.view(dtype=[('width', np.int16), ('length', np.int16)])
array([[(1, 2)],
[(4, 5)]], dtype=[('width', '<i2'), ('length', '<i2')])