Почему тип данных numpy возвращает void, когда он был создан как float64?

У меня есть этот код:

>>> d = np.dtype([("pos", np.float64, 3)])
>>> d[0].kind
'V'

Почему возвращается 'V' вместо 'f'? В полном коде мне нужно знать, соответствует ли поле целому числу, вещественному числу, строке...

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
58
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

d[0].kind не возвращает 'f', потому что это не тип d с плавающей запятой: это структурированный тип d с базой с плавающей запятой.

Существует несколько других атрибутов структурированных типов данных, которые вы можете проверить в зависимости от вашей конкретной цели. Например:

>>> d[0].base
dtype('float64')
>>> d[0].subdtype[0].kind
'f'

Ваш ответ ясно объясняет проблему (поэтому я его и выбрал), однако он применим не для всех возможных случаев в моем коде, где у меня есть такие вещи, как atom = np.dtype([("specie", str), ("pos", np.float64, 3)]). Поле specie не имеет subdtype. Как вы сказали, «в зависимости от вашей конкретной цели». Во всех возможных случаях для моего кода d[0].base.kind работает.

Abel Gutiérrez 13.06.2024 16:23

Не знаю, почему вы получаете 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, а не являются конкретным типом их отдельных элементов.

Я не осознавал, что поле — это структурированный тип данных (это то, что я изучаю сегодня).

Abel Gutiérrez 13.06.2024 16:25

Глядя на ваш более сложный 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, мне все равно нужно разобрать его по частям.

Другие вопросы по теме

Похожие вопросы

Получить (приблизительную) матрицу преобразования вращения (numpy) на единичной сфере с учетом отображения векторов (n = 12)
Невозможно удалить виджет после активации флажка в Python Tkinter
Как в Confluence воспроизвести ручной поиск с помощью поиска API?
Надежный способ проверить, был ли метод обернут декоратором изнутри
Как проверить, не может ли пользователь отправлять сообщения (был ограничен или отключен звук) в чате Telegram с помощью Telethon API?
Как сохранить векторы, созданные AzureOpenAIEmbeddingSkill, в индексаторе с учетом моей текущей настройки
Каков наиболее эффективный способ заполнения нескольких столбцов значениями из других столбцов таким образом, чтобы их можно было соединить с суффиксом?
Разбиение на страницы данных из DynamoDB при использовании FilterExpression и Limit
Get_swagger_ui_html вызывает отображение нежелательных параметров сервера в приложении FastAPI
Есть ли что-то вроде указателя для массивов numpy?