numpy.ndarray.view#

方法

ndarray.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 的實例,該實例查看相同的陣列(相同的形狀、dtype 等)。這不會導致記憶體的重新解讀。

對於 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)])

使用不同的型別和 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 大小(每個條目的位元組數)的視圖通常應避免在由切片、轉置、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 順序的,更改 dtype 的視圖也完全沒問題

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