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

实例化自定义结构化dtype的标量

如何解决实例化自定义结构化dtype的标量

我已经定义了一个自定义dtype。例如:

vec = np.dtype([('x',float),('y',('z',float)])
quat = np.dtype([('w',('v',vec)])

现在我要制作一个标量四元数:

quat((1.0,(0.0,0.0,0.0)))

我希望我的元组语法不可接受(如果有的话)。但是,相反,出现以下错误

TypeError: 'numpy.dtype' object is not callable

relevant portion中的documentation on scalars意味着可以在numpy中构建像这样的结构化类型的标量。

如何实例化quat标量?甚至有可能吗?

顺便说一下,我已经尝试了以下解决方法

np.array([(1.0,0.0))],dtype=quat)

这不会产生实际的标量(尽管老实说它可以很好地满足我的目的,这使问题基本上是理论上的)。在结果上调用item会返回tuple,而不是标量quat对象。

解决方法

在数组上调用item会产生一个元组,因为item是专门用于将NumPy类型转换为Python类型的。索引数组会产生类型为numpy.void的NumPy标量:

scalar = np.array([(1.0,(0.0,0.0,0.0))],dtype=quat)[0]
,

这是基于评论中的讨论。它比原本要痛苦的多,因为自定义标量的用例不太可能无法通过1元素数组方便地解决。

quat的类型为np.void

>>> quat.type
numpy.void

由于这是自定义类型的通用包,因此必须使用类似字节的对象实例化

>>> from struct import pack
>>> q = quat.type(pack('dddd',1.0,0.0))
>>> q
void(b'\x00\x00\x00\x00\x00\x00\xF0\x3F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

当然,由于它是通用的,因此您需要告诉它如何解释自身。幸运的是,标量也有一个view方法:

>>> q = q.view(quat)
>>> q
(1.,(0.,0.,0.))
>>> q.dtype
dtype([('w','<f8'),('v',[('x',('y',('z','<f8')])])

TL; DR

q = np.void(pack('dddd',0.0)).view(quat)

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