将值赋给numpy结构化数组

3
我将把结构化数据转换成numpy结构化数组。我已经阅读了关于这个主题的一些文档,但是由于文档质量不佳(抱歉,SciPy!),我仍然无法实现目标。
基本上,我想做像这样简单的事情:
import numpy as np

dt = [('contacts', '(2,4)f8'), 
      ('modelname', 'S10')]

arr = np.zeros((2,), dtype=dt)

testdata = [[99, 2, 3, 4], [7, 8, 9, 10]]

arr[0]['contacts'] = np.array(testdata)
arr[0]['modelname'] = 'test'
print arr

我希望看到结构化数组中的“联系人”字段设置为所需内容。

然而,输出结果是:

[([[99.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]], 'test')
 ([[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]], '')]

显然,只有第一个数字被分配了。

我发现了一个相关的错误问题。 - hpaulj
2个回答

3

您正在错误地索引数组。请尝试:

 arr['contacts'][0] = np.array(testdata)

即,对于 arr'contacts' 列,将以索引为 0 的行设置为你的 testdata。 当你写下 arr[0] 时,你检索到一个 "记录标量"。 实际上,如果你检查一下,你会发现 arr[0] 的类型是 numpy.void
对其进行赋值不会影响分配给整个记录的内存。相比之下,arr['contacts'] 创建了视图,对该数组视图中的 arr['contacts'][0] 进行赋值修改原始内存。
我同意 NumPy 文档应该更明确这一点...

-1

仅更改第一个数字的任务看起来对我来说有点错误,不仅仅是文档问题。

In [1496]: x = np.zeros((2,),dtype=('(2,3)i4,a4'))

In [1497]: x
Out[1497]: 
array([([[0, 0, 0], [0, 0, 0]], b''), ([[0, 0, 0], [0, 0, 0]], b'')], 
      dtype=[('f0', '<i4', (2, 3)), ('f1', 'S4')])

有一个错误的情况,它只分配第一个数字:

In [1498]: x[0]['f0'] = np.arange(1,7).reshape(2,3)

In [1499]: x
Out[1499]: 
array([([[1, 0, 0], [0, 0, 0]], b''), ([[0, 0, 0], [0, 0, 0]], b'')], 
      dtype=[('f0', '<i4', (2, 3)), ('f1', 'S4')])

但是添加[:]可以纠正这个问题 - 它的意思是“仅替换数据内容”

In [1500]: x[0]['f0'][:] = np.arange(1,7).reshape(2,3)

In [1501]: x
Out[1501]: 
array([([[1, 2, 3], [4, 5, 6]], b''), ([[0, 0, 0], [0, 0, 0]], b'')], 
      dtype=[('f0', '<i4', (2, 3)), ('f1', 'S4')])

使用元组设置整个元素 - 在文档中有描述。使用元组列表可以设置多个元素。

In [1502]: x[0] = (np.arange(2,8).reshape(2,3),'test')

In [1503]: x
Out[1503]: 
array([([[2, 3, 4], [5, 6, 7]], b'test'), ([[0, 0, 0], [0, 0, 0]], b'')], 
      dtype=[('f0', '<i4', (2, 3)), ('f1', 'S4')])

首先选择字段也可以(进一步证明您的情况引发了numpy的错误)

In [1504]: x['f0'][0] = np.arange(3,9).reshape(2,3)

In [1505]: x
Out[1505]: 
array([([[3, 4, 5], [6, 7, 8]], b'test'), ([[0, 0, 0], [0, 0, 0]], b'')], 
      dtype=[('f0', '<i4', (2, 3)), ('f1', 'S4')])

我对“记录标量”解释不满意。 xx ['f0'] x ['f0'] 都具有相同的 __array_interface__ 数据指针。

x ['f0'] [0] x [0] ['f0'] 具有相同的 __array_interface__ type 。两者都适用于像 + = 这样的操作。我发现唯一的区别在于直接数组分配。修改数组的一个元素是完全错误的。

通过切片选择行也可以正常工作:

x[:1]['f0'] = ...

看起来这个是相关的 Bug 问题

https://github.com/numpy/numpy/issues/3126


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接