





d[0].kind не возвращает 'f', потому что это не тип d с плавающей запятой: это структурированный тип d с базой с плавающей запятой.
Существует несколько других атрибутов структурированных типов данных, которые вы можете проверить в зависимости от вашей конкретной цели. Например:
>>> d[0].base
dtype('float64')
>>> d[0].subdtype[0].kind
'f'
Не знаю, почему вы получаете V (похоже, это связано с формой, поскольку np.dtype([("pos", np.float64)])[0].kind возвращает 'f'), но вы можете получить доступ к базовому типу :
d = np.dtype([("pos", np.float64, 3)])
d[0].base.kind
# 'f'
Вам необходимо получить базу:
import numpy as np
d = np.dtype([("pos", np.float64, 3)])
print(d[0].base.kind)
Потому что numpy.dtype.kind дает вам только символ типа скалярного типа массива, и это связано с тем, что структурированные типы данных имеют тип данных void, а не являются конкретным типом их отдельных элементов.
Я не осознавал, что поле — это структурированный тип данных (это то, что я изучаю сегодня).
Глядя на ваш более сложный dtype
In [20]: atom = np.dtype([("specie", str), ("pos", np.float64, 3)])
In [21]: atom
Out[21]: dtype([('specie', '<U'), ('pos', '<f8', (3,))])
In [22]: atom.fields
Out[22]: mappingproxy({'specie': (dtype('<U'), 0), 'pos': (dtype(('<f8', (3,))), 0)})
У вас есть два поля: одно имеет форму, другое просто «простое»:
In [23]: atom['pos']
Out[23]: dtype(('<f8', (3,)))
In [24]: atom['pos'].base
Out[24]: dtype('float64')
In [25]: atom['specie']
Out[25]: dtype('<U')
In [26]: atom['specie'].base
Out[26]: dtype('<U')
Поле составного типа dtype также является типом dtype и имеет тот же набор атрибутов, который указан на https://numpy.org/doc/stable/reference/generated/numpy.dtype.html
Чтобы полностью понять dtype, мне все равно нужно разобрать его по частям.
Ваш ответ ясно объясняет проблему (поэтому я его и выбрал), однако он применим не для всех возможных случаев в моем коде, где у меня есть такие вещи, как
atom = np.dtype([("specie", str), ("pos", np.float64, 3)]). Полеspecieне имеетsubdtype. Как вы сказали, «в зависимости от вашей конкретной цели». Во всех возможных случаях для моего кодаd[0].base.kindработает.