二维结构化数组
我想在Python中构建一个structured array
,它可以通过列和行的名称进行访问。这可能与structured array
方法的numpy?二维结构化数组
例子: 我的阵列大致有这样的形式:
My_array = A B C
E 1 2 3
F 4 5 6
G 7 8 9
,我想必须做以下可能性:
My_array["A"]["E"] = 1
My_array["C"]["F"] = 6
是否有可能使用为此在pyhton structured arrays
还是有另一种更适合这样的任务的结构?
使用重新数组,可以使用点符号或具体引用列名称来访问列。对于行,它们由行号访问。我还没有看到他们通过行名称访问,例如:
>>> import numpy as np
>>> a = np.arange(1,10,1).reshape(3,3)
>>> dt = np.dtype([('A','int'),('B','int'),('C','int')])
>>> a.dtype = dt
>>> r = a.view(type=np.recarray)
>>> r
rec.array([[(1, 2, 3)],
[(4, 5, 6)],
[(7, 8, 9)]],
dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
>>> r.A
array([[1],
[4],
[7]])
>>> r['A']
array([[1],
[4],
[7]])
>>> r.A[0]
array([1])
>>> a['A'][0]
array([1])
>>> # now for the row
>>> >>> r[0]
rec.array([(1, 2, 3)],
dtype=[('A', '<i4'), ('B', '<i4'), ('C', '<i4')])
>>>
您可以指定D型,并在同一时间类型
>>> a = np.ones((3,3))
>>> b = a.view(dtype= [('A','<f8'), ('B','<f8'),('C', '<f8')], type = np.recarray)
>>> b
rec.array([[(1.0, 1.0, 1.0)],
[(1.0, 1.0, 1.0)],
[(1.0, 1.0, 1.0)]],
dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
>>> b.A
array([[ 1.],
[ 1.],
[ 1.]])
>>> b.A[0]
array([ 1.])
基本结构数组给你的东西,可以用一个名字索引:
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
)生成。结果是每个标记列的命名字段以及文件中每行的编号“行”。
无法在评论中正确格式化,所以忍受着我。在[299]中:z = y.view(type = np.recarray),然后在[300]中:zA ['F']或In [3XX]:zAF产生数组(1) )recarrays只是增加了arry.field表示的arry ['field']的能力,所以zAF'看起来'比等效片段更好 – 2015-07-10 19:56:57
是的,我的'dt2' dtype可以转换为'recarray'并且可以用'xAF '。 dtype越复杂,'recarray'看起来越好。 – hpaulj
@hpaulj感谢您对不同可能性的讨论。我不知道嵌套'dtypes'的可能性。也许,我会在稍后尝试使用嵌套'dtypes'的最后一个建议。 – swot
您可以使用[pandas](http://pandas.pydata。org) – yangjie
@扬杰坦克,'熊猫'看起来很有希望。但是,我必须通过MPI接口传递这些数据'numpy'将是一个很好的解决方案,因为它们更快更容易通过接口。 – swot