一、副本和视图
- 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据。物理内存不在同一位置。
- 视图是数据的一个引用,原有数据不会产生拷贝。通过该引用可访问、操作原有数据。如果我们对视图进行修改,它会影响到原始数据。物理内存在同一位置。
1.1 ' = ' 赋值
‘ = ’赋值不会创建数组对象的副本。 它使用原始数组的相同id()来访问它。一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。
a = np.arange(6)
b = a # 等号赋值
# 内存地址相同
print(id(a)) # 1588378502768
print(id(b)) # 1588378502768
# 修改数值【变】
b[1] = 555
print(a) # [0 555 2 3 4 5]
print(b) # [0 555 2 3 4 5]
# 修改形状【变】
a.shape = (2, 3)
print(a) # [[0 555 2] [3 4 5]]
print(b) # [[0 555 2] [3 4 5]]
1.2 切片
对视图的修改会直接反映到原数据中。但是我们观察 a,b 的 id,他们是不同的,也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。
arr = np.arange(6)
a = arr[1:] # 切片赋值
b = arr[1:]
print(arr) # [0 1 2 3 4 5]
print(a) # [1 2 3 4 5]
print(b) # [1 2 3 4 5]
# 内存地址不同
print(id(arr)) # 2336936068720
print(id(a)) # 2336937813616
print(id(b)) # 2336950756736
# 修改数值【变】
a[1] = 555
print(arr) # [0 1 555 3 4 5]
print(a) # [1 555 3 4 5 ]
print(b) # [1 555 3 4 5 ]
# 修改形状【不变】
c = arr[:]
print(c) # [0 1 555 3 4 5]
c.shape=(2,3)
print(c) # [[0 1 555] [3 4 5]]
print(a) # [1 555 3 4 5]
1.3 ndarray.view()
ndarray.view() 方会创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数。
a = np.arange(6).reshape(2, 3)
b = a.view() # view()赋值
print(a) # [[0 1 2] [3 4 5]]
print(b) # [[0 1 2] [3 4 5]]
# 内存地址不同
print(id(a)) # 3013460633200
print(id(b)) # 3013473445168
# 修改数值【变】
a[0][1] = 555
print(a) # [[0 555 2] [3 4 5]]
print(b) # [[0 555 2] [3 4 5]]
# 修改形状【不变】
b.shape = (1, 6)
print(b) # [[0 555 2 3 4 5]]
print(a) # [[0 555 2] [3 4 5]]
1.4 ndarray.copy()
darray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.copy() # b与a不共享任何内容
# 修改数值【不变】
b[0, 0] = 100
print(b) # [[100 2 3] [4 5 6]]
print(a) # [[1 2 3] [4 5 6]]
二、数组操作
2.1 修改数组形状
- np.reshape() 函数可以在不改变数据(视图)的条件下修改形状,共享数据。
- np.ndarray.flat() 是一个数组元素迭代器,相当于np.nditer(ndarray).
- np.ndarray.flatten() 展平的数组元素,返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
- np.ravel() 展平的数组元素,顺序通常是"C风格",返回的是数组视图,修改会影响原始数组。
a = np.arange(6)
b = a.reshape(2, 3)
print(a) # [0 1 2 3 4 5]
print(b) # [[0 1 2] [3 4 5]]
b[0][0]=9
print(a) # [9 1 2 3 4 5]
print(b) # [[9 1 2] [3 4 5]]
a = np.arange(6).reshape(2, 3)
for row in a:
print(row)
'''
[0 1 2]
[3 4 5]
'''
# 对数组中每个元素都进行处理,可以使用flat属性,该属性是一个数组元素迭代器:
for element in a.flat: