#python #numpy #nan
#python #numpy #nan
Вопрос:
В большинстве представлений с плавающей запятой возможно несколько разных типов NaN (например, тихие NAN, сигнальные NAN и т.д.). Я предполагаю, что это также верно в numpy. У меня есть конкретное битовое представление NaN, определенное в C и импортированное в python. Я хочу проверить, содержит ли массив полностью этот конкретный битовый шаблон с плавающей запятой. Есть ли какой-либо способ сделать это?
Обратите внимание, что я хочу проверить, содержит ли массив этот конкретный NaN, а не имеет ли он NAN вообще.
Ответ №1:
Numpy позволяет вам иметь прямой доступ к байтам в вашем массиве. Для простого случая вы можете просматривать nan непосредственно как целые числа:
quiet_nan1 = np.uint64(0b0111111111111000000000000000000000000000000000000000000000000000)
x = np.arange(10, dtype=np.float64)
x.view(np.uint64)[5] = quiet_nan1
x.view(np.uint64)
Теперь вы можете просто сравнить элементы для битового шаблона вашего точного NaN. Эта версия сохранит форму, поскольку элементы имеют одинаковый размер.
Более общее решение, которое позволило бы вам работать с такими типами, как float128
, которые не имеют соответствующего целочисленного аналога в большинстве систем, заключается в использовании байтов:
quiet_nan1l = np.frombuffer((0b01111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000).to_bytes(16, 'big'))
x = np.arange(3 * 4 * 5, dtype=np.float128).reshape3, 4, 5)
x.view(np.uint8).reshape(*x.shape, 16)[2, 2, 3, :] = quiet_nan1l
x.view(np.uint8).reshape(*x.shape, 16)
Окончательное изменение формы не является строго необходимым, но это очень удобно, поскольку оно изолирует исходные элементы массива по последнему измерению.
В обоих случаях изменение представления изменяет исходный массив. Это точка зрения.
И если, конечно, само собой разумеется (именно поэтому я это говорю), что это относится к любому другому шаблону битов, который вы, возможно, захотите назначить или протестировать, а не только к NaNs.