微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Numpy中没有结构化数组的二进制运算符?

如何解决Numpy中没有结构化数组的二进制运算符?

对整个阵列进行操作的另一种方法是使用文档中描述的’union’dtype。在您的示例中,您可以通过添加“联合”字段并指定重叠的“偏移量”来扩展dtype:

from numpy import array, ones, zeros

names=['scalar', '1d-array', '2d-array', 'union']
formats=['float64', '(3,)float64', '(2,2)float64', '(8,)float64']
offsets=[0, 8, 32, 0]
my_dtype = dict(names=names, formats=formats, offsets=offsets)
struct_array3=zeros((4,), dtype=my_dtype)

['union']现在可以访问所有数据作为(n,8)数组

struct_array3['union'] # == struct_array3.view('(8,)f8')
struct_array3['union'].shape  # (4,8)

您可以对“联合”或任何其他字段进行操作:

struct_array3['union'] += 2
struct_array3['scalar']= 1

“联合”字段可以是另一个兼容的形状,例如'(2,4)float64'。这样的数组的“行”可能看起来像:

array([ (3.0, [0.0, 0.0, 0.0], [[2.0, 2.0], [0.0, 0.0]], 
      [[3.0, 0.0, 0.0, 0.0], [2.0, 2.0, 0.0, 0.0]])], 
      dtype={'names':['scalar','1d-array','2d-array','union'], 
             'formats':['<f8',('<f8', (3,)),('<f8', (2, 2)),('<f8', (2, 4))], 
             'offsets':[0,8,32,0], 
             'itemsize':64})

解决方法

好的,因此,在完成了有关numpy的结构化数组的教程之后,我可以创建一些简单的示例:

from numpy import array,ones
names=['scalar','1d-array','2d-array']
formats=['float64','(3,)float64','(2,2)float64']
my_dtype = dict(names=names,formats=formats)
struct_array1 = ones(1,dtype=my_dtype)
struct_array2 = array([(42.,[0.,1.,2.],[[5.,6.],[4.,3.]])],dtype=my_dtype)

(我的预期用例将包含三个以上的条目,并且将使用非常长的1d数组。)因此,一切顺利,直到我们尝试执行一些基本的数学运算为止。我收到以下所有错误:

struct_array1 + struct_array2
struct_array1 * struct_array2
1.0 + struct_array1
2.0 * struct_array2

显然,即使最简单的结构化数组也不支持简单的运算符(+,-,*,/)。还是我错过了什么?我应该看看其他包装吗(不要说熊猫,因为这完全太过分了)?这似乎是一项显而易见的功能,所以我有点傻眼了。但是,很难在网上找到关于此的chat不休。这不会严重限制结构化数组的用途吗?为什么有人会使用结构数组而不是包装在字典中的数组?是否出于技术上的原因可能难以解决?或者,如果正确的解决方案是执行繁重的工作,那么在保持操作快速的同时又如何呢?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。