Python 中 NumPy 的位元組交換

2021-09-28 20:03:37 字數 2666 閱讀 3670

大端模式(big-endian):高位位元組放在記憶體的低位址端,低位位元組排放在記憶體的高位址端,即正序排列,高尾端;符號位的判定固定為第乙個位元組,容易判斷正負。

小端模式(little-endian):低位位元組放在記憶體的低位址端,高位位元組排放在記憶體的高位址端,即逆序排列,低尾端;強制轉換資料不需要調整位元組內容

ndarrays 是乙個為記憶體中的資料提供 python 陣列介面的物件。

假定從大端模式機器寫入的檔案中載入了 4 個位元組。我知道這 4 個位元組代表兩個 16 位整數。在大端模式機器上,首先以最高有效位元組(msb)儲存雙位元組整數,然後儲存最低有效位元組(lsb)。因此位元組按記憶體順序排列:

msb整數1,lsb整數1,msb整數2,lsb整數2

假設兩個整數實際上是 1 和 770。因為 770 = 256 * 3 + 2,記憶體中的 4 個位元組將分別包含:0,1,3,2。我從檔案載入的位元組將包含這些內容:

>>> big_end_buffer = bytearray([0,1,3,2])

>>> big_end_buffer

bytearray(b'\x00\x01\x03\x02')

對這個記憶體建立乙個陣列,並告訴 numpy 有兩個整數,並且它們是 16 位和 big-endian:

>>> import numpy as np

>>> big_end_arr = np.ndarray(shape=(2,),dtype='>i2', buffer=big_end_buffer)

>>> big_end_arr[0]

1>>> big_end_arr[1]

770

注意上面的陣列 dtype > i2。> 表示 big-endian ( < 是 little-endian ),i2 表示『有符號的 2 位元組整數。例如,如果是單個無符號 4 位元組小端整數,則 dtype 字串將為 >> little_end_u4 = np.ndarray(shape=(1,),dtype='>> little_end_u4[0] == 1 * 256**1 + 3 * 256**2 + 2 * 256**3

true但標量當前不包含位元組順序資訊,因此從陣列中提取標量將返回本機位元組順序的整數。因此:

>>> big_end_arr[0].dtype.byteorder == little_end_u4[0].dtype.byteorder

true

從介紹中可以想象,有兩種方法可以影響陣列的位元組順序與它所檢視的底層記憶體之間的關係:

1.  arr.newbyteorder():更改陣列 dtype 中的位元組順序資訊,以便將基礎資料解釋為不同的位元組順序。

2. arr.byteswap():更改基礎資料的位元組順序,保留dtype解釋。

什麼情況需要更改位元組順序:

1. 資料和 dtype 位元組順序不匹配,希望更改dtype以使其與資料匹配。

2. 資料和 dtype 位元組順序不匹配,希望交換資料以使它們與dtype匹配

3. 資料和 dtype 位元組順序匹配,希望交換資料和dtype來反映這一點

資料和dtype位元組順序不匹配,更改dtype以匹配資料

假定不匹配的資料如下:

>>> wrong_end_dtype_arr = np.ndarray(shape=(2,),dtype='>> wrong_end_dtype_arr[0]

256

解決方法為更改 ​​dtype,以給出正確的位元組順序:

>>> fixed_end_dtype_arr = wrong_end_dtype_arr.newbyteorder()

>>> fixed_end_dtype_arr[0]

1

此時,記憶體中的陣列未更改:

>>> fixed_end_dtype_arr.tobytes() == big_end_buffer

true

資料和型別位元組順序不匹配,更改資料以匹配dtype

可以在記憶體寫入需要特定位元組排序的檔案。

>>> fixed_end_mem_arr = wrong_end_dtype_arr.byteswap()

>>> fixed_end_mem_arr[0]

1

此時,記憶體為:

>>> fixed_end_mem_arr.tobytes() == big_end_buffer

false

資料和dtype位元組序匹配,交換資料和dtype

假定存在正確指定的陣列 dtype,但需要陣列在記憶體中具有相反的位元組順序,並且您希望 dtype 匹配以便陣列值有意義。在這種情況下,需執行上述兩個操作:

1false

使用 ndarray astype 方法可以更簡單地將資料轉換為特定的 dtype 和位元組順序:

1false

Python 中 NumPy 的廣播

廣播描述了 numpy 如何在算術運算期間處理具有不同形狀的陣列。為了實現形狀相容,較小的陣列仍在較大的陣列上 廣播 廣播提供了一種向量化陣列操作的方法,以便在 c 而不是 python 中進行迴圈。numpy 通常在逐個元素的基礎上對陣列對進行操作。在最簡單的情況下,兩個陣列必須具有完全相同的形狀...

Python中的Numpy矩陣

與使用陣列一樣,需要從numpy中匯入matrix或者mat模組 from numpy import matrix,mat這裡使用mat建立乙個矩陣 ss.t但是這裡的轉置並沒有改變原變數中的值,如果需要使用,需要新建立乙個變數進行賦值使用。如果需要將兩個矩陣的每個元素對應相乘時使用numpy中的m...

Python中numpy的應用

建立ndarray import numpy as np nd np.array 2,4,6,11 numpy中預設ndarray的所有元素的資料型別是相同,如果資料的型別不同,會統一為統一型別,優先順序為str float int nd array 2 4 6 11 dtype 使用np建立rou...