2013-08-30 5 views
1

Это выдержка из сайта PyBrain. Я получаю большую часть того, что происходит, но одна строка меня полностью запятнала. Раньше я никогда не видел ничего подобного в коде python. Здесь весь цикл, для контекста:Python "здесь, ... где" строительство

for c in [0, 1, 2]: 
     #have no friggin idea how this next line works 
     here, _ = where(tstdata['class']==c) 
     plot(tstdata['input'][here, 0], tstdata['input'][here, 1], 'o') 

странно «где» Классификатор от NumPy, и я получаю то, что делает. Тем не менее я никогда не видел «здесь». Может кто-нибудь объяснить, что именно это делает?

ответ

6

Нет ничего волшебного, where - простая функция, определенная где-то в другом месте, которая возвращает кортеж из двух элементов и присваивает действие автоматически распаковывает их в переменную here и переменную _. Если вместо функции where мы пытаемся с простыми tuple:

>>> here, _ = ("a", "b") 
>>> here 
'a' 
>>> _ 
'b' 
+0

Спасибо! Кажется, это странный способ распаковать кортеж для меня. Зачем назначать одинокий знак подчеркивания? Является ли это стандартной идиомой python для распаковки? –

+0

Подчеркивание, я думаю, становится условным обозначением для имени переменной, которое мы не собираемся использовать. Тем не менее, он может быть использован в случае необходимости. –

1

pybrain использует результат нарезать многомерный массив.

>>> a 
array([[3, 1, 0, 2], 
     [1, 2, 1, 2], 
     [1, 3, 3, 0], 
     [0, 1, 0, 0]]) 

>>> b 
array([3, 3, 1, 2]) 

>>> np.where(b==3) 
(array([0, 1]),) 

Используя эту наивность либо возвращает более высокий одномерный массив или сделать шаткие вещи:

>>> a[np.where(b==3),0] 
array([[3, 1]]) 

Вы можете распаковать кортеж или сделать ниже, чтобы вернуть ожидаемый результат:

>>> a[np.where(b==3)[0],0] 
array([3, 1]) 

Причина, по которой это опасно:

>>> here, _ = np.where(b==3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: need more than 1 value to unpack 

Для изменения выше:

here= where(tstdata['class']==c) 
plot(tstdata['input'][here[0], 0], tstdata['input'][here[0], 1], 'o') 
+0

ОП сказал, что понимает «где». Он не понимает распаковку 'tuple'. –

+0

Распаковка 'tuple', как показано, не всегда синтаксически действительна. Полное объяснение того, что происходит, должно облегчить это. – Daniel

+0

@ Офион, не могли бы вы рассказать об этом? Какой лучший синтаксис? –

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

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