Numpy:检索`dtype`的统一方式

时间:2018-04-25 09:02:51

标签: python numpy

如果我有一个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

1 个答案:

答案 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)
    # ...