我有一個復雜的嵌套結構化陣列(通常用作recarray)。對于此示例,它進行了簡化,但在實際情況中存在多個級別。
c = [('x','f8'),('y','f8')]
A = [('data_string','|S20'),('data_val', c, 2)]
zeros = np.zeros(1, dtype=A)
print(zeros["data_val"]["x"])
我試圖索引嵌套陣列資料型別的“x”資料型別而不定義前面的命名欄位。我希望類似的東西print(zeros[:,"x"])可以讓我對所有頂級資料進行切片,但它不起作用。
有沒有辦法通過訪問它們的欄位名稱對嵌套結構化陣列進行花哨的索引?
uj5u.com熱心網友回復:
我不知道顯示結果陣列是否有助于可視化嵌套。
In [279]: c = [('x','f8'),('y','f8')]
...: A = [('data_string','|S20'),('data_val', c, 2)]
...: arr = np.zeros(2, dtype=A)
In [280]: arr
Out[280]:
array([(b'', [(0., 0.), (0., 0.)]), (b'', [(0., 0.), (0., 0.)])],
dtype=[('data_string', 'S20'), ('data_val', [('x', '<f8'), ('y', '<f8')], (2,))])
請注意嵌套()和[]反映欄位嵌套的方式。
arr.dtype 只能直接訪問頂級欄位名稱:
In [281]: arr.dtype.names
Out[281]: ('data_string', 'data_val')
In [282]: arr['data_val']
Out[282]:
array([[(0., 0.), (0., 0.)],
[(0., 0.), (0., 0.)]], dtype=[('x', '<f8'), ('y', '<f8')])
但是在訪問了一個欄位之后,我們可以查看它的欄位:
In [283]: arr['data_val'].dtype.names
Out[283]: ('x', 'y')
In [284]: arr['data_val']['x']
Out[284]:
array([[0., 0.],
[0., 0.]])
記錄編號索引是獨立的,通常意義上可以是多維的:
In [285]: arr[1]['data_val']['x'] = [1,2]
In [286]: arr[0]['data_val']['y'] = [3,4]
In [287]: arr
Out[287]:
array([(b'', [(0., 3.), (0., 4.)]), (b'', [(1., 0.), (2., 0.)])],
dtype=[('data_string', 'S20'), ('data_val', [('x', '<f8'), ('y', '<f8')], (2,))])
由于該data_val欄位具有 (2,) 形狀,我們可以將該索引與 (2,) 形狀混合/匹配arr:
In [289]: arr['data_val']['x']
Out[289]:
array([[0., 0.],
[1., 2.]])
In [290]: arr['data_val']['x'][[0,1],[0,1]]
Out[290]: array([0., 2.])
In [291]: arr['data_val'][[0,1],[0,1]]
Out[291]: array([(0., 3.), (2., 0.)], dtype=[('x', '<f8'), ('y', '<f8')])
我提到欄位索引就像dict索引。請注意以下欄位的顯示:
In [294]: arr.dtype.fields
Out[294]:
mappingproxy({'data_string': (dtype('S20'), 0),
'data_val': (dtype(([('x', '<f8'), ('y', '<f8')], (2,))), 20)})
每條記錄存盤為一個 52 位元組的塊:
In [299]: arr.itemsize
Out[299]: 52
In [300]: arr.dtype.str
Out[300]: '|V52'
其中 20 個是data_string, 32 個是 2 個c欄位
In [303]: arr['data_val'].dtype.str
Out[303]: '|V16'
您可以要求一個欄位串列,并獲得一種特殊的view. 它的 dtype 顯示有點不同
In [306]: arr[['data_val']]
Out[306]:
array([([(0., 3.), (0., 4.)],), ([(1., 0.), (2., 0.)],)],
dtype={'names': ['data_val'], 'formats': [([('x', '<f8'), ('y', '<f8')], (2,))], 'offsets': [20], 'itemsize': 52})
In [311]: arr['data_val'][['y']]
Out[311]:
array([[(3.,), (4.,)],
[(0.,), (0.,)]],
dtype={'names': ['y'], 'formats': ['<f8'], 'offsets': [8], 'itemsize': 16})
每個“data_val”從 20 個位元組開始到 52 個位元組的記錄中。每個 'y' 從 8 個位元組開始到它的 16 位元組記錄中。
uj5u.com熱心網友回復:
該陳述句在陣列中zeros['data_val']創建一個視圖,該視圖在該點可能已經不連續。您可以提取多個值,x因為c它是一種陣列型別,這意味著x具有明確定義的步幅和形狀。該陳述句的語意zeros[:, 'x']非常不清楚。例如,沒有 的 會發生data_string什么x?我預計會出現錯誤;你可能會期待別的東西。
我可以看到索引被簡化的唯一方法是,如果你直接展開c,A有點像 C 中的匿名結構,除了你不能用陣列輕松做到這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410484.html
標籤:
下一篇:從稀疏表示創建Numpy陣列
