2012-06-05 5 views
1

Рассмотрим следующий NumPy массив DTYPE float32:Автоматическое продвижение float32 в numexpr

In [29]: x = numpy.arange(10, dtype=numpy.float32) 

Когда я умножить его на 2 с помощью pytables.Expr, я получаю float32 массив обратно:

In [30]: tables.Expr('x * 2').eval().dtype 
Out[30]: dtype('float32') 

Но когда я умножьте его на 2.0, я получаю массив float64:

In [31]: tables.Expr('x * 2.0').eval().dtype 
Out[31]: dtype('float64') 

Есть ли способ указать литерал с плавающей запятой в приведенном выше выражении таким образом, чтобы не приводил к тому, что результат должен быть повышен до float64?

В целом, у меня есть выражение, используя float32 массивы, и я хочу, чтобы гарантировать, что результат также типа float32 (я не против float64 используется для промежуточных вычислений, но я не могу позволить себе хранить результаты как float64). Как мне это сделать?

ответ

1

Я вполне уверен, что pytables.Expr основан на Numexpr. Документация Numexpr отмечает следующее о продвижении в выражениях:

В операциях, подразумевающих скаляр и массив, нормальные правила литья используются в Numexpr, в отличие от NumPy, где типы массивов имеет приоритет. Например, если 'a' является массивом типа float32 и 'b' является скаляром типа float64 (или типа float типа Python, который эквивалентен ), то 'a * b' возвращает float64 в Numexpr, но float32 в NumPy (т.е. операнды массива принимают приоритет при определении результата ). Если вам нужно сохранить результат float32, обязательно используйте скаляр float32 .

Так что это, вероятно, то, что происходит. Постоянная с плавающей запятой отвечает за продвижение до 64-битных поплавков, и решение должно явно указывать константы с плавающей запятой как float32.

 Смежные вопросы

  • Нет связанных вопросов^_^