如果我有一个numpy数组x
,我可以使用这样的dtype
获取其数据类型:
t = x.dtype
然而,这显然不适用于列表之类的东西。我想知道是否有一种标准的方法来检索列表和numpy数组的类型。在列表的情况下,我想这将意味着适合所有数据的最大类型。例如,如果
x = [ 1, 2.2 ]
我希望这样的方法可以返回float
,或者更好numpy.float64
。
直觉上,我认为这是numpy.dtype
方法的目的。但事实并非如此。该方法用于创建类型,而不是 extract 类型。
我知道获取类型的唯一方法是使用numpy数组包装传入的任何对象,然后获取dtype
:
def dtype(x):
return numpy.asarray(x).dtype
然而,这种方法的问题是,如果数组不是一个numpy数组,它将复制该数组。在这种情况下,对于这种简单的操作来说,这是非常沉重的。
那么我可以使用的numpy
方法不会要求我做任何列表副本吗?
我正在设计一个用于进行几何操作的库...旋转矩阵,旋转矢量,四元数,欧拉角等之间的转换。
很容易发生用户只使用单个旋转矢量(具有3个元素)。在这种情况下,他们可能会写类似
的内容q = vectorToQuaternion([ .1, 0, 0 ])
在这种情况下,我希望输出四元数是一个类型为numpy.float64
的numpy数组。但是,有时为了加快计算速度,用户可能想要使用一个numpy数组float32'
q = vectorToQuaternion(numpy.float32([ .1, 0, 0 ]))
在这种情况下,我认为期望输出是同一类型是很自然的。
问题在于我无法使用zeros_like
函数(或empty_like
等),因为四元数有4个组件,而向量有3个。所以在内部,我必须做类似< / p>
def vectorToQuaternion(v):
q = empty( (4,), dtype = asarray(v).dtype )
...
如果有一种方法可以使用empty_like
来提取输入的所有属性,但是让我指定输出的形状,那么这对我来说是理想的功能。但是,据我所知,您无法在empty_like
的调用中指定形状。
以下是我正在谈论的课程的一些要点,以及一个测试课程(以便您可以看到我打算如何使用它)。
课程:https://gist.github.com/mholzel/c3af45562a56f2210270d9d1f292943a
测试:https://gist.github.com/mholzel/1d59eecf1e77f21be7b8aadb37cc67f2
答案 0 :(得分:2)
如果你真的想这样做,你可能不得不使用np.asarray
,但我不确定这是解决问题最可行的方法。如果用户忘记添加.
并给出[1, 0, 0]
,那么您将创建整数输出,这绝对对四元数没有意义。如果它是某个float类型的数组,我会使用输入的np.float64
默认为dtype
,并且可能还提供显式传递dtype的选项:
import numpy as np
def vectorToQuaternion(v, dtype=None):
if dtype is None:
if isinstance(v, np.ndarray) and np.issubdtype(v.dtype, np.floating):
# Or if you prefer:
if np.issubdtype(getattr(v, 'dtype', np.int), np.floating):
dtype = v.dtype
else:
dtype = np.float64
q = np.empty((4,), dtype=dtype)
# ...