5 用Numpy實現結構體

2021-09-21 06:24:54 字數 1356 閱讀 3397

1、結構陣列:

在c語言中我們可以通過struct關鍵字定義結構型別,結構中的字段佔據連續的記憶體空間,每個結構體占用的記憶體大小都相同,因此可以很容易地定義結構陣列。和c語言一樣,在numpy中也很容易對這種結構陣列進行操作。只要numpy中的結構定義和c語言中的定義相同,numpy就可以很方便地讀取c語言的結構陣列的二進位制資料,轉換為numpy的結構陣列。

假如我們需要建立的c語言的結構如下圖:

1

struct

cal_ctrl;

本結構體為我的乙個專案中用到的部分巨集定義沒有給出

現在使用python中的numpy實現這個結構體:

1 cal_ctrl = np.dtype(,align=true)#

結構體中資料型別

view code

在這段**中使用np.dtype來建立結構的每個字段,並且對每個欄位的型別進行初始化型別,

可以使用下面的**來新增例項;

a =np.array([(......),(.......)],

dtype=cal_ctrl)#或者

a= np.empty((1), dtype=cal_ctrl)#

建立了乙個空的例項

#可以使用numpy建立陣列的方法來建立它的例項,需要自建立陣列的函式中加dtype=cal_ctrl

可以使用a.dtype來檢視結構的資料型別

a[0][''ifrm_num''] = 45

#通過a來修改或者訪問結構的屬性。

使用下面的**可以將python結構裝換為bin二進位制檔案來提供給c語言使用

a.tofile("test.bin")
記憶體對其問題:

c語言的結構體為了記憶體定址方便,會自動的新增一些填充用的位元組,這叫做記憶體對齊。例如如果把下面的name[32]改為name[30]的話,由於記憶體對齊問題,在name和age中間會填補兩個位元組,最終的結構體大小不會改變。因此如果numpy中的所配置的記憶體大小不符合c語言的對齊規範的話,將會出現資料錯位。為了解決這個問題,在建立dtype物件時,可以傳遞引數align=true,這樣numpy的結構陣列的記憶體對齊和c語言的結構體就一致了。

利用下面的c語言可以把二進位制檔案讀出來:

#

include

struct person

;struct person p[2];

void main ()

posted @

2018-06-15 09:49

田灣第一帥 閱讀(

...)

編輯收藏

用python實現結構體陣列

在c語言中我們可以通過struct關鍵字定義結構型別,結構中的字段佔據連續的記憶體空間,每個結構體占用的記憶體大小都相同,因此可以很容易地定義結構陣列。和c語言一樣,在numpy中也很容易對這種結構陣列進行操作。只要numpy中的結構定義和c語言中的定義相同,numpy就可以很方便地讀取c語言的結構...

用結構體實現通訊錄

問題描述 實現乙個通訊錄 通訊錄可以用來儲存1000個人的資訊,每個人的資訊包括 姓名 性別 年齡 住址 提供方法 1.新增聯絡人資訊 2.刪除指定聯絡人資訊 3.查詢指定聯絡人資訊 4.修改指定聯絡人資訊 5.顯示所有聯絡人資訊 6.清空所有聯絡人資訊 標頭檔案 contacts.h ifndef...

結構體中呼叫結構體成員到底用 還是用

結構體成員運算子。指標運算子。1 如果結構體中的成員均為一般變數 包括結構體變數 則使用 如果成員變數為指標 不管指向什麼,包括結構體 則使用 2 如果定義了結構體陣列指標,則可分別使用 和 區別在於指標帶下標時,以是陣列形式訪問,此時用 如果不帶下標 或使用偏移 此時用 用指向結構體型別變數表示結...