gpt4 book ai didi

python - numpy append_field 为具有 2d 形状的新字段提供形状错误

转载 作者:太空狗 更新时间:2023-10-30 00:51:16 25 4
gpt4 key购买 nike

我有一个结构化的 numpy 数组,我想使用 recfunctions 库 http://pyopengl.sourceforge.net/pydoc/numpy.lib.recfunctions.html函数 append_fields() 或 rec_append_fields() 附加一个字段塑造它。但是,我得到一个错误:

ValueError: operands could not be broadcast together with shapes (10) (10,3)

其中 10 是我现有数组的长度,(3,) 是我要追加的字段的形状。

例如:

import numpy as np
from numpy.lib.recfunctions import append_fields


my_structured_array = np.array(
zip([0,1,2,3],[[4.3,3.2],[1.4,5.6],[6.,2.5],[4.5,5.4]]),
dtype=[('id','int8'),('pos','2float16')]
)
my_new_field = np.ones(
len(my_structured_array),
dtype='2int8'
)
my_appended_array = append_fields(
my_structured_array,
'new',
data=my_new_field
)

ValueError: operands could not be broadcast together with shapes (4) (4,2)

有什么想法吗?我尝试制作 my_new_field 元组列表并放置一个数据类型将具有适当形状的参数放入 append_fields() 中:

my_new_field = len(my_structured_array)*[(1,1)]

my_appended_array = append_fields(
my_structured_array,
'new',
data=my_new_field,
dtype='2int8'
)

但是一旦它被转换为 numpy 数组,结果似乎是一样的。

当我使用 rec_append_fields() 而不是简单地使用时,这一切似乎都没有改变追加字段()

编辑:鉴于我的新字段的形状与数组的形状不同,我想我想要的追加是不可能的,由 @radicalbiscuit 建议.

In : my_new_field.shape
Out: (4, 2)

In : my_structured_array.shape
Out: (4,)

但是,我在数组中包含了一个与原始数组形状不同的原始字段来说明我的观点,即字段不必与结构化数组具有相同的形状。如何附加这样的字段?

In : my_structured_array['pos'].shape
Out: (4, 2)

In : my_new_field.shape
Out: (4, 2)

我应该注意,对于我的应用程序,我可以附加一个空字段,只要以后可以以某种方式更改形状即可。谢谢!

最佳答案

append_fields()确实确实要求两个阵列的形状相同。话虽这么说,正如您在 my_structured_array 中意识到的那样, numpy 确实支持子数组(也就是说,字段本身可以是具有形状的数组)。

在你的情况下,我想你可能想要 my_new_field不是二维数组,而是具有 dtype 元素的一维数组(形状为 shape(my_structured_array) ),例如 dtype([('myfield', '<i8', (2,))]) .例如,

import numpy as np
from numpy.lib.recfunctions import append_fields

my_structured_array = np.array(
zip([0,1,2,3],[[4.3,3.2],[1.4,5.6],[6.,2.5],[4.5,5.4]]),
dtype=[('id','int8'),('pos','2float16')]
)

my_new_field = np.ones(
len(my_structured_array),
dtype=[('myfield', 'i8', 2)]
)

my_appended_array = append_fields(
my_structured_array,
'new',
data=my_new_field
)

会屈服,

>>> my_appended_array[0]
(0, [4.30078125, 3.19921875], ([1, 1],))

虽然数据类型有点不方便,如myfield嵌套在 new 中,

>>> my_appended_array.dtype
dtype([('id', '|i1'), ('pos', '<f2', (2,)), ('new', [('myfield', '<i8', (2,))])])

然而,这很容易被强制关闭,

>>> np.asarray(my_appended_array, dtype=[('id', '|i1'), ('pos', '<f2', (2,)), ('myfield', '<i8', (2,))])
array([(0, [4.30078125, 3.19921875], [0, 0]),
(1, [1.400390625, 5.6015625], [0, 0]), (2, [6.0, 2.5], [0, 0]),
(3, [4.5, 5.3984375], [0, 0])],
dtype=[('id', '|i1'), ('pos', '<f2', (2,)), ('myfield', '<i8', (2,))])

不过,我们不得不重复 my_structured_array 的数据类型,这有点不幸。这里。虽然乍一看似乎 numpy.lib.recfunctions.flatten_descr可以做扁平化 dtype 的肮脏工作,不幸的是它给出了一个元组而不是 np.dtype 所要求的列表。 .然而,将其输出强制到列表可以解决这个问题,

>>> np.dtype(list(np.lib.recfunctions.flatten_descr(my_appended_array.dtype)))
dtype([('id', '|i1'), ('pos', '<f2', (2,)), ('myfield', '<i8', (2,))])

这可以作为 dtype 传递给 np.asarray ,使事情对 my_structured_array.dtype 的变化稍微更稳健。 .

确实,诸如此类的小不一致会使处理记录数组变得困惑。人们感觉事情可以更连贯地组合在一起。

编辑:结果是 np.lib.recfunctions.merge_arrays函数更适合这种合并,

 >>> my_appended_array = merge_arrays([my_structured_array, my_new_field], flatten=True)
array([(0, [4.30078125, 3.19921875], [1, 1]),
(1, [1.400390625, 5.6015625], [1, 1]), (2, [6.0, 2.5], [1, 1]),
(3, [4.5, 5.3984375], [1, 1])],
dtype=[('id', '|i1'), ('pos', '<f2', (2,)), ('myfield', '<i8', (2,))])

关于python - numpy append_field 为具有 2d 形状的新字段提供形状错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13795390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com