Изменить форму правил назначения - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть этот пример кода, где значение «а» явно не обновляется в логике кода. Тем не менее, когда я печатаю вывод - обе переменные 'a' и 'b' обновляются. Не могли бы вы объяснить мне причину этого?

import numpy as np
a=np.ones((3,3))
N=9
a = np.reshape(a, (N, 1), 'F')

for i in np.arange(0, N, 1):
    b = np.reshape(a, (N, 1), 'F')
    b[i, 0] = a[i, 0] + 5
    print(i)
    print('a', a[i, 0])
    print('b', b[i, 0], '\n')

Output:
0
a 6.0
b 6.0 

1
a 6.0
b 6.0 

2
a 6.0
b 6.0 

3
a 6.0
b 6.0 

4
a 6.0
b 6.0 

5
a 6.0
b 6.0 

6
a 6.0
b 6.0 

7
a 6.0
b 6.0 

8
a 6.0
b 6.0 

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Я попробовал следующую вещь, и она работает

 a=np.ones((3,3))
 N=9
 print(a)
 b=np.ones((3,3))
 b = a+5
0 голосов
/ 01 ноября 2018

b является копией а. Потому что функция np.reshape не обязательно возвращает копию. Как сказано в документации: -

Это будет новый вид объекта, если это возможно; в противном случае это будет копия. Обратите внимание, что нет никакой гарантии расположения памяти (C- или Fortran-смежных) возвращаемого массива.

Если вы хотите каким-то образом узнать, является ли ваша копия копией или нет, посмотрите на Как узнать, создает ли NumPy вид или копию?

...