目录
一、Numpy视图和副本
副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
视图:看起来的样子
- numpy 的切片操作返回原数据的视图。
- 调用 ndarray 的 view() 函数产生一个视图。
副本:完全复制一个新的出来
- Python 序列的切片操作,调用deepCopy()函数。
- 调用 ndarray 的 copy() 函数产生一个副本。
二、Numpy索引和切片
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
1.索引
索引:数组名称[页,行,列]
import numpy as np
arr01 = np.arange(1,25).reshape(4,6)
# arr01[1][1]
arr01[1,1]
arr02 = arr01.reshape(2,4,3)
arr02[0,2,1]
2.切片
切片:数组名[行的开始值:行的结束值:步长,列的开始值:列的结束值:步长]
array([[[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]],
[[13, 14, 15],
[16, 17, 18],
[19, 20, 21],
[22, 23, 24]]])
arr02[0:2 ,1:3 ,1:3 ]
3.多维数组切片
print(a[0, 1:4]) # >>>[12 13 14]
print(a[1:4, 0]) # >>>[16 21 26]
print(a[::2,::2]) # >>>[[11 13 15]
# [21 23 25]
# [31 33 35]]
print(a[:, 1]) # >>>[12 17 22 27 32]
如你所见,通过对每个以逗号分隔的维度执行单独的切片,你可以对多维数组进行切片。因此,对于2D数组,我们的第一片定义了行的切片,第二片定义了列的切片。
注意,只需输入数字就可以指定行或列。上面的第一个示例从数组中选择第0列。
下面的图表说明了给定的示例切片是如何进行工作的。
4.高级索引
-
整数数组索引:数组名[[页的索引],[行的索引],[列的索引]]
array([[ 1, 7, 13, 19], [ 2, 8, 14, 20], [ 3, 9, 15, 21], [ 4, 10, 16, 22], [ 5, 11, 17, 23], [ 6, 12, 18, 24]]) arr01[[1,2,3,],[0,1,2,]]
-
布尔索引:数组名[条件]
arr01[arr01>10] 产生的是一个一维数组
三、Numpy 广播(Broadcast)
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。
广播的规则的简单理解:对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:
- 数组拥有相同形状。
- 当前维度的值相等。
- 当前维度的值有一个是 1。
1.数组与数组的运算
- 形状相同:对应每个位置的元素进行运算
- 行数为1,列数相同
- 列数为1,行数相同
import numpy as np
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print (c)
# 输出结果 [ 10 40 90 160]
2.数和数组的运算
- 自动触发广播机制
import numpy as np
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
print(a + b)
# 输出结果 [[ 1 2 3]
# [11 12 13]
# [21 22 23]
# [31 32 33]]
四、Numpy迭代数组
1. 双层for循环
import numpy as np
arr01 = np.arange(1,13).reshape(4,3)
arr01
for item in arr01:
for ele in item:
print(ele)
2. array.flat
for item in arr01.flat:
print(item)
3. np.nditer(array)
for item in np.nditer(arr01):
print(item)
五、Numpy形状
1.视图变维
打印出来的样子是发生变化了,在内存中的本质没有发生变化。
array.reshape()
2.就地变维
array.flatten()
3.复制变维
array.flatten()