У меня были проблемы с использованием numpy.average, каждый раз возникала ошибка, пока я не преобразовал входные данные в numpy.float64s. Я посмотрел на источник, и это из-за следующего поведения, в чем причина разницы?

>>> f, f32 = numpy.float(1.0), numpy.float32(1.0)

>>> (f == 1.0).any()

Traceback (most recent call last):
  File "<pyshell#80>", line 1, in <module>
    (f == 1.0).any()
AttributeError: 'bool' object has no attribute 'any'
>>> (f32 == 1.0).any()
True
1
ayeayeron 14 Дек 2015 в 06:27

3 ответа

Лучший ответ

Это потому, что объект numpy.float32 не возвращает объект bool при сравнении с __eq__, а объект numpy.bool_.

>>> type((f == 1.0))
<type 'bool'>
>>> type((f32 == 1.0))
<type 'numpy.bool_'>
1
Dleep 14 Дек 2015 в 04:12

Обычно вам не нужно использовать выражения вроде numpy.float(1.0).

Самая распространенная базовая операция в numpy - создать массив.

f = np.array([1.0, 1.23])
mf = f.mean()  # or
mf = np.mean(f)

Или с целыми числами

f = np.array([1, 3, 5, 3, 5])
f==3
(f==3).any()

Обратите внимание, что я использую целые числа с == тестом. Тест == не очень хорошая идея при использовании чисел с плавающей точкой.

Я мог бы пойти дальше и указать dtype:

 f = np.arange(5, dtype=int)
 f = np.ones((3,4), dtype=float)

Отдельные элементы этих массивов будут иметь тип np.float, np.int и т. Д. Редко возникает необходимость в непосредственном создании np.float(1.23). Укажите dtype при создании массива, но в противном случае пусть numpy позаботится об этих деталях.

0
hpaulj 14 Дек 2015 в 03:51
>>> type(numpy.float32(1.0))
<type 'numpy.float32'>
>>> type(numpy.float(1.0))
<type 'float'>
>>> type(numpy.float32(1.0) == 1.0)
<type 'numpy.bool_'>
>>> type(numpy.float(1.0) == 1.0)
<type 'bool'>

numpy.float32 и numpy.bool_ используются не только для хранения скалярного, но и векторного:

>>> numpy.float32([1.0, 2.0])
array([ 1.,  2.], dtype=float32)
>>> numpy.float32([1.0, 2.0]) == 1.0
array([ True, False], dtype=bool)

Так что в numpy.bool_ есть функция any(), чтобы проверить, является ли какой-либо из элементов Истиной.

2
eph 14 Дек 2015 в 03:36