0

我想将记录数组中几个字段的内容复制到 ndarray 中(均为 float64 类型)。当recarray数据在每个字段中都有一个值时,我知道如何做到这一点:

my_ndarray[:,0]=my_recarray['X']  #(for field 'X')

现在我有一个recarray,每个字段中有一个包含5个浮点数的列表,我只想复制每个列表的第一个元素。当我将上述内容与新的recarray(和列表)一起使用时,出现此错误:

ValueError: could not broadcast input array from shape (92,5) into shape (92)

这是完全有道理的(事后看来)。

我想我可以用这个得到每个元素的第一个元素:

my_ndarray[:,0]=my_recarray['X'][0]  #(for field 'X')

我收到此错误:

ValueError: could not broadcast input array from shape (5) into shape (92)

我有点理解...... numpy 只取第一行(5 个元素)并尝试广播到 92 个元素的列。

所以....现在我想知道如何将每个列表的第一个元素放在 92 个元素列中,挠我的头......提前感谢您的建议。

4

1 回答 1

2

我的猜测是,其中recarray一个dtype字段的形状为 5:

In [48]: dt = np.dtype([('X',int,5),('Y',float)])
In [49]: arr = np.zeros(3, dtype=dt)
In [50]: arr
Out[50]: 
array([([0, 0, 0, 0, 0], 0.), ([0, 0, 0, 0, 0], 0.),
       ([0, 0, 0, 0, 0], 0.)], dtype=[('X', '<i8', (5,)), ('Y', '<f8')])

按名称访问此字段会生成一个形状为 (3,5) 的数组(类似于您的 (92,5):

In [51]: arr['X']
Out[51]: 
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

这可以描述为每条记录的 5 个项目的列表,但是使用字段名称进行索引会产生一个二维数组,该数组可以像任何二维 numpy 数组一样进行索引。

让我们将这些值设置为一些有趣的东西:

In [52]: arr['X'] = np.arange(15).reshape(3,5)
In [53]: arr
Out[53]: 
array([([ 0,  1,  2,  3,  4], 0.), ([ 5,  6,  7,  8,  9], 0.),
       ([10, 11, 12, 13, 14], 0.)],
      dtype=[('X', '<i8', (5,)), ('Y', '<f8')])

我们可以通过以下方式获取该字段的第一列:

In [54]: arr['X'][:,0]
Out[54]: array([ 0,  5, 10])

如果您有多个具有这种结构的字段,您可能必须按名称访问每个字段。使用多字段索引可以做的事情是有限制的。

于 2018-11-01T20:35:08.407 回答