#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
что это просто псевдоним pythonfloat
. Ноnp.float32
иnp.float64
являются np-реализациями числа с одинарной и двойной точностью соответственно.
Комментарии:
1. Спасибо. Также это преобразование типов
(np.array([1, 2, 3]) > 2).astype('int')
(часть метода to_l() выше) работает по той же причине, о которой вы упомянули, хотя([1, 2, 3]) > 2).astype('int')
и не работает, поскольку списки не могут быть преобразованы в целые числа.