基本結構數組給你的東西,可以用一個名字索引:
In [276]: dt=np.dtype([('A',int),('B',int),('C',int)])
In [277]: x=np.arange(9).reshape(3,3).view(dtype=dt)
In [278]: x
Out[278]:
array([[(0, 1, 2)],
[(3, 4, 5)],
[(6, 7, 8)]],
dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
In [279]: x['B'] # index by field name
Out[279]:
array([[1],
[4],
[7]])
In [280]: x[1] # index by row (array element)
Out[280]:
array([(3, 4, 5)],
dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
In [281]: x['B'][1]
Out[281]: array([4])
In [282]: x.shape # could be reshaped to (3,)
Out[282]: (3, 1)
視圖方法產生了一個2d數組,但只有一列。通常的列被dtype字段替換。這是2D,但有一個轉折點。通過使用view
,數據緩衝區不變; dtype只是提供了訪問這些'列'的不同方式。在技術上,dtype
字段不是維度。它們不在陣列的.shape
或.ndim
中註冊。你也不能使用x[0,'A']
。
recarray
做了同樣的事情,但增加了訪問字段作爲屬性的選項,例如, x.B
與x['B']
相同。
rows
仍然必須通過索引號訪問。
另一種構造結構化數組的方法是將定義的值作爲元組列表。
In [283]: x1 = np.arange(9).reshape(3,3)
In [284]: x2=np.array([tuple(i) for i in x1],dtype=dt)
In [285]: x2
Out[285]:
array([(0, 1, 2), (3, 4, 5), (6, 7, 8)],
dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
In [286]: x2.shape
Out[286]: (3,)
ones
,zeros
,empty
還構造基本結構化陣列
In [287]: np.ones((3,),dtype=dt)
Out[287]:
array([(1, 1, 1), (1, 1, 1), (1, 1, 1)],
dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
我可以構建被索引與2字段名,由嵌套dtypes數組:
In [294]: dt1=np.dtype([('D',int),('E',int),('F',int)])
In [295]: dt2=np.dtype([('A',dt1),('B',dt1),('C',dt1)])
In [296]: y=np.ones((),dtype=dt2)
In [297]: y
Out[297]:
array(((1, 1, 1), (1, 1, 1), (1, 1, 1)),
dtype=[('A', [('D', '<i4'), ('E', '<i4'), ('F', '<i4')]), ('B', [('D', '<i4'), ('E', '<i4'), ('F', '<i4')]), ('C', [('D', '<i4'), ('E', '<i4'), ('F', '<i4')])])
In [298]: y['A']['F']
Out[298]: array(1)
但坦率地說這是相當複雜的。我甚至沒有想到如何將元素設置爲arange(9)
(沒有迭代字段名稱)。
結構化陣列最常見的是通過csv
文件與np.genfromtxt
(或loadtxt
)生成。結果是每個標記列的命名字段以及文件中每行的編號「行」。
您可以使用[pandas](http://pandas.pydata。org) – yangjie
@揚傑坦克,'熊貓'看起來很有希望。但是,我必須通過MPI接口傳遞這些數據'numpy'將是一個很好的解決方案,因爲它們更快更容易通過接口。 – swot