用python實現結構體陣列

2021-09-27 07:18:31 字數 2482 閱讀 3482

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

import numpy as np

mytype=np.dtype(

)a=np.array([(

"tang",23

,130.2),

("wang",22

,100.2)]

,dtype=mytype)

#或者data=np.array([(『zero』,0.,0.)]*10,dtype=mytype) #建立data[2]

#date[0]['name']="tang"

我們先建立乙個dtype物件persontype,通過其字典引數描述結構型別的各個字段。字典有兩個關鍵字:names,formats。每個關鍵字對應的值都是乙個列表。names定義結構中的每個欄位名,而formats則定義每個字段*的型別:

a.dtype
結果顯示:

dtype([('name', 's32'), ('age', '這裡我們看到了另外一種描述結構型別的方法: 乙個包含多個組元的列表,其中形如(欄位名, 型別描述) 的組元描述了結構中的每個字段。型別描述前面為我們新增了 '<'字元,這些字元用來描述字段值的位元組順序:

結構陣列的訪問方式和一般陣列相同,通過下標能夠取得其中的元素,注意元素的值看上去像是組元,實際上它是乙個結構:

a[0]

結果顯示:

(b'tang', 23, 130.2)
a[0]

.dtype

結果顯示:

dtype([('name', 's32'), ('age', 'a[0]是乙個結構元素,它和陣列a共享記憶體資料,因此可以通過修改它的字段,改變原始陣列中的對應字段:

c=a[0]

c["name"]=

"lian"

#修改元素屬性a[0

]["name"

]

結果顯示:

b'lian'
結構像字典一樣可以通過字串下標獲取其對應的字段值:

a[1]

["name"

]

結果顯示:

b'wang'
我們不但可以獲得結構元素的某個字段,還可以直接獲得結構陣列的字段,它返回的是原始陣列的檢視,因此可以通過修改b[0]改變a[0][』『age』』]:

b=a[:]

["salary"

]#或者a["salary"]

b

結果顯示:

array([130.2, 100.2], dtype=float32)
通過呼叫a.tostring或者a.tofile方法,可以直接輸出陣列a的二進位制形式:

a.tofile(

"test.bin"

)

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

#include

struct person

;struct person p[2]

;void main (

)

用下面的字典引數也可以定義結構型別,字典的關鍵字為結構中欄位名,值為字段的型別描述,但是由於字典的關鍵字是沒有順序的,因此欄位的順序需要在型別描述中給出,型別描述是乙個組元,它的第二個值給出欄位的位元組為單位的偏移量,例如age欄位的偏移量為25個位元組:

np.dtype(

)

結果顯示:

dtype([('name', 's25'), ('age', 'u1')])

結構體 結構體陣列

void test 函式遞迴呼叫 允許函式體裡再次呼叫函式本身 使用遞迴一定要有出口 long fact int n return n fact n 1 定義乙個新的資料型別 struct mypoint 結構體型別所占用的記憶體空間是最大資料型別的整數倍。因為結構體型別的變數在分配記憶體時有記憶體...

結構體 結構體陣列

struct 結構體型別名 型別名 成員名 型別名 成員名 先宣告結構體型別,再定義結構體變數名 宣告結構體型別,不分配空間 定義結構體型別變數,就要分配記憶體空間 作 者 hh 完成日期 2018年8月15日 版本號 v1.0 問題描述 結構體巢狀 賦值 輸出 輸入描述 程式輸出 include ...

5 用Numpy實現結構體

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