Сравнение списков с числовыми числами с плавающей запятой и обычными числами с плавающей запятой

#python

#python

Вопрос:

Учитывая следующий код:

 def to_l(pos_probs, threshold):
    return (pos_probs >= threshold).astype('int')

thresh = np.arange(0, 0.2, 0.1)
print(thresh)

  

Это работает:

 print([to_l([0.2,0.3], w) for w in thresh])
  

Результат:

 [0.  0.1]
[array([1, 1]), array([1, 1])]
  

Но это не:

 [to_l([0.2,0.3], w) for w in [0.,0.1]]
  

И это не:

 to_l([0.2,0.3], 0.1)
  

Выдает ошибку:

 TypeError: '>=' not supported between instances of 'list' and 'float'
  

Ошибка типа очевидна во второй и третьей ситуации. Мы сравниваем список [0.2,0.3] с числом с плавающей запятой 0.1.
Но кто-нибудь объяснит, почему это работает в первой ситуации?

Комментарии:

1. Потому thresh что это numpy.ndarray

2. это действительно не имеет ничего общего с пониманием списков, это вопрос о numpy

3. ДА. Я удалю это из названия.

4. Это работает [to_l([0.2,0.3], w) for w in np.array([0.,0.1])] . Также [([0.2,0.3], w) for w in np.array([0.,0.1])] дает тот же результат, [([0.2,0.3], w) for w in [0.,0.1]] что и . Тем не менее, [to_l([0.2,0.3], w) for w in [0.,0.1]] не работает.

5. Я буду читать больше о numpy.ndarray

Ответ №1:

Это называется широковещательной передачей, которая поддерживается numpy. Поэтому, когда два операнда в операции имеют разные формы, numpy попытается передать его и выполнить операцию.

  • [0.2,0.3] >= 0 не будет работать, потому что numpy здесь не задействован. Вы получите сообщение об ошибке:
 TypeError: '>=' not supported between instances of 'list' and 'float'
  
  • np.array([1, 2, 3]) > 2 будет работать, так как появится numpy broadcasting.
  • [1, 2, 3] > np.float32(2) также будет работать

Однако,

  • [1, 2, 3] > np.float(2) не будет работать, потому np.float что это просто псевдоним python float . Но np.float32 и np.float64 являются np-реализациями числа с одинарной и двойной точностью соответственно.

Комментарии:

1. Спасибо. Также это преобразование типов (np.array([1, 2, 3]) > 2).astype('int') (часть метода to_l() выше) работает по той же причине, о которой вы упомянули, хотя ([1, 2, 3]) > 2).astype('int') и не работает, поскольку списки не могут быть преобразованы в целые числа.