如何解决实例化自定义结构化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 举报,一经查实,本站将立刻删除。