Вам нужна копия:
b = a.copy()
b = a
создает ссылку так a is b
, они оба указывают на то же место в памяти, a.copy()
фактически создает новый объект.
In [5]: a = numpy.zeros(4)
In [6]: b = a # reference
In [7]: id(a)
Out[7]: 140335847505968
In [8]: id(b) # same id's
Out[8]: 140335847505968
In [9]: a is b
Out[9]: True
In [10]: b = a.copy() # new object
In [11]: id(a)
Out[11]: 140335847505968
In [12]: id(b) # # now different id's
Out[12]: 140335437696176
In [13]: a is b # b is no longer pointing to the same memory location
Out[13]: False
Если вы отрезаете массив, используя basic slicing, то идентификаторы будут отличаться, но любые изменения будут отражены в обоих а и Ь, как при использовании основных Индексация Все массивы, порожденные основной нарезка всегда вид исходного массива. A view is Массив, который не имеет собственных данных, но вместо этого ссылается на данные другого массива. Таким образом, представление представляет собой новый объект, но содержимое по-прежнему принадлежит исходному массиву.
Однако при использовании advanced indexingAdvanced индексирования всегда возвращает копию данных
In [141]: a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [142]: b = a[1:7:2] # basic indexing/view
In [143]: id(a)
Out[143]: 140335437385856
In [144]: id(b)
Out[144]: 140335437356528
In [145]: b[0] = 999
In [146]: a
Out[146]: array([ 0, 999, 2, 3, 4, 5, 6, 7, 8, 9])
In [148]: b
Out[148]: array([999, 3, 5])
In [149]: a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [150]: b = a[[0,3,5]] # advanced indexing/copy
In [151]: b
Out[151]: array([0, 3, 5])
In [152]: b[0] = 999
In [153]: a
Out[153]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [154]: b
Out[154]: array([999, 3, 5])
In [157]: a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [158]: b = a[a] # copy
In [159]: b
Out[159]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [160]: b[0] = 99
In [161]: a
Out[161]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [162]: b
Out[162]: array([99, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Это специфическое Numpy поведения, нарезку регулярного питона плоский списка всегда будет создавать новый список, в котором изменения в не будут отражено в b.
In [190]: a = [1,2,3,4,5]
In [191]: b = a[:3]
In [192]: b[0] = 999
In [193]: a
Out[193]: [1, 2, 3, 4, 5]
In [194]: b
Out[194]: [999, 2, 3]
Где вы будете пойманы со списком питона, если список содержит подсписки и создать неполную копию:
In [197]: a = [[1,2,3],[4,5]]
In [198]: b = a[:]
In [199]: id(a)
Out[199]: 140335437468296
In [200]: id(b)
Out[200]: 140335437417992
In [201]: b[0][0] = 999
In [202]: b
Out[202]: [[999, 2, 3], [4, 5]]
In [203]: a
Out[203]: [[999, 2, 3], [4, 5]]
Вы должны были бы сделать copy.deepcopy:
In [204]: a = [[1,2,3],[4,5]]
In [205]: from copy import deepcopy
In [206]: b = deepcopy(a)
In [207]: b[0][0] = 999
In [208]: b
Out[208]: [[999, 2, 3], [4, 5]]
In [209]: a
Out[209]: [[1, 2, 3], [4, 5]]
Назначение не создает копию. Чтобы понять, почему ваше ожидание было неправильным, см. [Факты и мифы о именах и ценностях Python] (http://nedbatchelder.com/text/names.html) от Ned Batchelder. Важно прочитать подробное если вы действительно поймете Python. –