numpy数组副本与视图;
区别:副本是一个新数组,对副本所做的任何更改都不会影响原数组,对原数组的更改也不会影响副本。而视图只是原始数组的视图,不拥有数据,对视图做的任何更改都会影响原数组,对原数组的更改也会影响视图 。
a = np.array([1,2,3,4,5,6])
x = a.copy() x即为a的副本
y = a.view() y即为a的视图
检查数组是否拥有数据
print(x.base)
print(y.base)
如果该数组拥有数据,则base属性返回None
所以副本则返回None,视图则返回原始数组
数组形状
数组的形状是每个维中元素的数量
shape:返回一个元组,每个索引具有相应元素的数量
例如:a = np.array([[1,2,3,4],[5,6,7,8]])
print(a.shape) 结果为(2,4),意思是该数组是二维的,每个维度有4个元素
数组重塑
通过重塑可以添加或删除维度或更改每个维度中的元素数量
a = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
new = a.reshape(4,3)
将a转换为4个数组,每个数组包含3个元素
new = a.reshape(2,3,2)
最外边有两个数组,其中包含3个数组,每个数组包含两个元素
结果为:[[[ 1 2] [ 3 4] [ 5 6]] [[ 7 8][ 9 10] [11 12]]]
重塑后的数组里边的元素要相等,否则要报错
重塑后返回的是视图
可以使用-1,这样就不用指定确切的数字
例如:new = a.reshape(2,3,-1),numpy会计算这个数字
也可以使用-1将多维转换为1维
例如:new = a.reshape(-1)
还有一些功能可以改变数组形状,这部分属于中、高级部分,将在后边讲解
数组迭代
1、遍历元素,在numpy中处理多维数组时,可以使用for循环来完成这个操作,但是必需迭代每个维度中的数组
例如:a = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
for x in a:
for y in x:
for z in y:
print(z)
结果为:1 2 3 4 5 6 7 8 9 10 11 12
2、该方法对于高维度的数组可能很难编写
可以使用函数nditer(),就可以将上述代码简化成
for x in nop.nditer(a):
print(x)
3、迭代不同数据类型的数组时,可以使用op_dtypes参数传递期望的数据类型,这样可以在迭代时更改元素的数据类型。nditer不会就地更改数据类型,所以需要启用额外的空间,称为buffer,在nditer()中传参flags=['buffered']即可
例如:arr = np.array([1, 2, 3])
for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S']):
print(x)
4、以不同的步长迭代
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
for x in np.nditer(arr[:, ::2]):
print(x)
结果为:1 3 5 7
5、使用 ndenumerate() 进行枚举迭代:可以迭代出元素所对应的序号
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
for idx, x in np.ndenumerate(arr):
print(idx, x)
结果为:
(0, 0) 1
(0, 1) 2
(0, 2) 3
(0, 3) 4
(1, 0) 5
(1, 1) 6
(1, 2) 7
(1, 3) 8