2016-12-15 10 views
2

Рассмотрите несколько присвоений x[0],y = y,x[0]. Применительно к каждому из четырех нижеприведенных случаев это дает четыре разных результата.Несколько присвоений с массивами и списками Numpy, любопытный пример

  • Случай 1:

    x = [[1,2], [3,4]] 
    y = [5,6] 
    

    дает

    x = [[5,6], [3,4]] 
    y = [1,2] 
    
  • Случай 2:

    x = np.array([[1,2], [3,4]]) 
    y = [5,6] 
    

    дает

    x = array([[5,6], [3,4]]) 
    y = array([5,6]) 
    
  • Случай 3:

    x = [[1,2], [3,4]] 
    y = np.array([5,6]) 
    

    дает

    x = [array([5,6]), [3,4]] 
    y = [1,2] 
    
  • Случай 4:

    x = np.array([[1,2], [3,4]]) 
    y = np.array([5,6]) 
    

    дает

    x = array([[5,6], [3,4]]) 
    y = array([5,6]) 
    

Похоже, что множественное назначение списков более умное (проходящее через временную переменную автоматически), чем множественное назначение массивов Numpy.

Мысли?

EDIT: Это не умнее Afterall ...

+0

«Оказывается, что множественное присваивание списков умнее (происходит через временную переменную автоматически), чем многократного присвоения Numpy массивов.» -- Как так? При назначении в массив Numpy он превращается в часть массива Numpy. – Scimonster

ответ

5

Единственные удивительные случаи здесь должны быть 2 & 4:

x = np.array([[1,2], [3,4]]) 
y = np.array([5,6]) # or [5, 6] 

давая

x = array([[5,6], [3,4]]) 
y = array([5,6]) # where did the 1 and 2 go? 

Так как другие просто поменяв вокруг типов данных, но сохраняя то же значение.

Что изменилось при использовании numpy, так это то, что x[0] возвращает вид, а не копию.Таким образом, даже выписывая временный в назначении кортежа явно не удается:

temp = x[0] 
x[0] = y 
y = temp 

Поскольку temp вид, что всегда такой же, как x[0], а не копию значения x[0] в данный момент времени.

Чтобы сделать эту работу для Numpy случае, вы должны использовать x[0],y = y,x[0].copy()

+0

Ну, да, 2 и 4 являются интересными, но для полноты я добавил их все. – Gioker

1
x[0],y = y,x[0] 

равна

t = x[0] 
x[0] = y 
y = t 

Как @Scimonster отметил,

При назначении в массив Numpy, он превращает это в часть массива Numpy .

Так что это нормальное поведение.

+0

На самом деле эти два кодовых блока равны. Не создается временная переменная 't'; внутренне 'y' и' x [0] 'помещаются в стек, перебрасываются и затем отбрасываются для назначения. Эти два подхода могут привести к разным результатам. –

+0

@ajcr: Помимо названия 't', которое было сбито, вы можете построить случай, когда результаты будут отличаться? – Eric

+0

@ Эрик: Я думаю, что я неправильно помнил что-то вроде [этого вопроса] (http://stackoverflow.com/questions/31566500/python-setting-two-variable-values-separated-by-a-comma-in- python/31566736 # 31566736), с которым я столкнулся некоторое время назад (что я вижу теперь не вовлекает временную переменную). Я думаю, что должно быть возможно построить странные примеры, которые мутируют переменные inplace во время назначения (так что оставляя временную переменную без изменений), но пока я не смогу придумать что-то убедительное, я отвлечу свой предыдущий комментарий. –