Если у меня есть массив NumPy x
, я могу получить его тип данных, используя dtype
, например:
t = x.dtype
Однако это явно не сработает для таких вещей, как списки. Интересно, существует ли стандартный способ получения типов для списков и массивов. В случае списков, я думаю, это будет означать самый большой тип, который подходит для всех данных. Например, если
x = [ 1, 2.2 ]
Я бы хотел, чтобы такой метод возвращал float
, а еще лучше numpy.float64
.
Интуитивно я думал, что это было целью метода numpy.dtype
. Однако это не так. Этот метод используется для создания типа, а не извлечения типа.
Единственный известный мне способ получения типа - это обернуть любой объект, переданный в массив, и затем получить dtype
:
def dtype(x):
return numpy.asarray(x).dtype
Однако проблема с этим подходом заключается в том, что он будет копировать массив, если он еще не является массивом с нулевыми значениями. В этих обстоятельствах это чрезвычайно тяжело для такой простой операции.
Так есть ли метод numpy
, который я могу использовать, который не потребует от меня делать какие-либо копии списка?
EDIT
Я проектирую библиотеку для выполнения некоторых геометрических манипуляций ... Преобразования между матрицами вращения, векторами вращения, кватернионами, углами Эйлера и т. Д.
Может легко случиться так, что пользователь просто работает с одним вектором вращения (который имеет 3 элемента). В этом случае они могут написать что-то вроде
q = vectorToQuaternion([ .1, 0, 0 ])
В этом случае я бы хотел, чтобы выходной кватернион был массивом типа numpy.float64
. Тем не менее, иногда для ускорения вычислений пользователь может захотеть использовать простой массив float32:
q = vectorToQuaternion(numpy.float32([ .1, 0, 0 ]))
В этом случае, я думаю, естественно ожидать, что вывод будет того же типа.
Проблема в том, что я не могу использовать функцию zeros_like
(или empty_like
и т. Д.), Потому что кватернион имеет 4 компонента, а вектор - 3. Поэтому внутренне я должен сделать что-то вроде
def vectorToQuaternion(v):
q = empty( (4,), dtype = asarray(v).dtype )
...
Если бы был способ использования empty_like
, который извлекает все свойства ввода, но позволяет мне указать форму вывода, то это было бы для меня идеальной функцией. Однако, насколько мне известно, вы не можете указать форму при вызове empty_like
.
EDIT
Вот несколько основных моментов для класса, о котором я говорю, и тестового класса (чтобы вы могли видеть, как я собираюсь его использовать).
Класс: https://gist.github.com/mholzel/c3af45562a56f2210270d9d1f292943a
Тесты: https://gist.github.com/mholzel/1d59eecf1e77f21be7b8aadb37cc67f2