2015-03-24 5 views
4

Таким образом, с Numpy массивы назначая одного к другому только копирует ссылочный: т.е.Numpy назначая нарезать, когда массив копируется

import numpy as np 
x = np.array([5,8]) 
y = x 
y += 1 
x 
Out: array([6, 9]) 

И если я хочу глубокую копию, то я должен использовать x.copy(). И то же самое верно при представлении из более высокого размерного массива, например.

A=np.array([[4,10],[8,1]]) 
b=A[:,1] 
b+=1 
A 
Out: array([[ 4, 11], 
      [ 8, 2]]) 

И наоборот (продолжая сверху):

A[:,1]=b 
b 
Out: array([11, 2]) 
b+=1 
A 
Out: array([[ 4, 12], 
      [ 8, 3]]) 

Так до здесь все работает стабильно. Но теперь, если я продолжать и делать:

A[:,0] = b 
A 
Out: array([[12, 12], 
      [ 3, 3]]) 
b 
Out: array([12, 3]) 
b+=1 
A 
Out: array([[12, 13], 
      [ 3, 4]]) 

То, что я не понимаю, почему первый столбец остается прежним, а другой нет? Почему второй столбец продолжает указывать на массив b? Есть ли какое-либо правило для решения, когда массив будет сильно скопирован при назначении?

+0

Я не знаю, что такое python, но он похож на указатель C++. Вы можете назначить 1 ячейку памяти для нескольких переменных (как и многие переменные, читайте один и тот же указатель памяти), а не 1 переменную для большого объема памяти (1 var read multiple memory pointer) – Vuwox

ответ

3

Когда вы делаете

b=A[:,1] 

он создает ссылку на основной массив. Но в этом случае

A[:,0] = b 

только значения copied.As результат в последнем заявлении первый столбец остается неизменным, а второй столбец, который до сих пор ссылаются б изменений. Take a look at this

+0

Спасибо. И эта ссылка не перезаписывается, когда я делаю 'A [:, 1] = b' later? И спасибо за ссылку, но я обнаружил, что 'B [:] = A' также сделал ссылку, а не отдельную копию. –

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