概述
numpy入门学习笔记
- 一.快速创建numpy数组
- 二.切片以及索引
- 1.一维
- 2.多维
- 多维索引
- 多维度切片,索引
- 数组索引
- 三.广播 broadcast
- 快速判断能否广播:
- 广播的规则:
- 四.np.r_以及np.c_#
- 五. hstack以及vstack
- 六. np数组的运算
- 1.逻辑比较
- 2.where函数运算
- 3.数组元素的修改
- 4.数组的轴转换
- 5.矩阵乘与矩阵元素相乘
一.快速创建numpy数组
arr1 = np.ones((3, 3))# 全1
arr2 = np.zeros((3, 3))# 全0
zeros以及ones创建的数组均为float类型
arr3 = np.eye(4)# 4*4的单位矩阵`
arr4 = np.arange(9).reshape(3, -1)
reshape可将原数组变成对应形状
arr = np.arange(8).reshape(2, 4)
arr3 = arr.reshape(4,2)
arr4 = arr.T
arr = [[0 1 2 3],[4 5 6 7]]
arr3 = [[0 1]
[2 3]
[4 5]
[6 7]]
arr4 =[[0 4]
[1 5]
[2 6]
[3 7]]
因为numpy的元素都顺序存储,所以reshape和转置的结果不一定相同。同时对元素的操作也不同
二.切片以及索引
1.一维
print(arr[0])
print(arr[0:])
print(arr[:])
print(arr[1:4])
print(arr[1:4:2])# 步长为2
仅对第一个维度进行切片和索引
2.多维
多维索引
print(arr[0, 0])# 0
print(arr[1, 2])# 6
多维度切片,索引
print(arr4[:, 0:1])# 分别对各个维度进行切片 常用
print(arr4[1:3, 1:3])# [[4, 5],[7 ,8]]
print(arr4[0:1, 0:1])# 等维度的切片不降维 常用
print(arr4[0:1, 0])# int索引会降维
print(arr4[:, [0]])# 维度不变 [[0] [3] [6]]
常用
print(arr4[:, 0])# 降维 [0 3 6]
print(arr4[:, [1, 0]])
print(arr4[[0, 1, 2], [0]])# [arr4[0][0] ,arr4[1][0] , arr4[2][0]]
当切片+数组时,数组选取对应维度上的元素
数组索引
取得对应下标的元素
print(arr4[[1, 0, 2]])
print(arr4[[0, 1, 2], [0, 1, 2]])# (0,0) (1,1) (2,2)
print(arr4[[0, 1, 2], 0])# 广播 arr4[[0, 1, 2], [0, 0, 0]]
print(arr4[[0, 1, 2], [0]])# [arr4[0][0] ,arr4[1][0] , arr4[2][0]] 等同于[0]广播
print(arr4[0, [0, 1, 2]])# 广播 [[0,0,0], [0, 1, 2]]
print(arr4[[0, 1, 2], [0, 1]])# 无法广播
只要不出现切片,都可看做取对应元素。只是一个和多个的区别
三.广播 broadcast
数组相加减,相乘时 ,缺少元素会进行广播
快速判断能否广播:
- 看形状:从右往左看而且只需要看最短的。
- 对应位置的元素要么相同,要么其中一个为1。
广播的规则:
- 维度不同时,最高维为输出的最终维度。
- 不够最终维度的数组,要往前面扩维度。
- 同维度的元素个数,要么相同,要么其中一个为1,那就可以进行广播,否则就不可以,广播的时候,为1的将复制。
(2,3,5,7) 与 (5,7) 可以
(2,3,5,7) 与 (5,) 不可以
(5,7)与(7,5) 不可以
(1,7)与(7,1) 可以
(2,3) 与 0 可以,任何形状跟标量都可以
四.np.r_以及np.c_#
a = np.array([1,2,3])
a = [1
2
3]
b = a.repeat(3)
b = [1
1
1
…
3]
c = np.tile(a ,3)
print(b.shape)
#(9,) 列向量
print(c.shape)
#(9,) 列向量
d = np.r_[b,c]#按列相加 还是列向量(只是numpy方便显示,为一行数组),还是一维
d: [1 1 1 2 2 2 3 3 3 1 2 3 1 2 3 1 2 3]
e = np.c_[b,c]
#按行相加 得到(9,2)的二维数组
e: [[1 1]
[1 2]
[1 3]
[2 1]
[2 2]
[2 3]
[3 1]
[3 2]
[3 3]]
a = np.array([1,2,3]).reshape(1,3) #都初始为二维数组,就可以按照显示的行列堆叠
b = a.repeat(3).reshape(1,-1)
c = np.tile(a ,3)
print(b.shape)
#(1,9) 二维数组
print(c.shape)
#(1,9) 二维数组
二维之后就可按照显示的行列顺序进行叠加了
d = np.r_[b,c]#按列相加,得到(2,9)的二维数组
d: [[1 1 1 2 2 2 3 3 3]
[1 2 3 1 2 3 1 2 3]]
e = np.c_[b,c]
#按行相加 得到(1,18)的二维数组
'e: [[1 1 1 2 2 2 3 3 3 1 2 3 1 2 3 1 2 3]]
五. hstack以及vstack
- 在进行vstack叠加时,默认将一维数组元素变成了二维。
- 但是二维与三维叠加,二维不会变成三维。即一维可以与二维可以进行vstack
- hstack不会改变维度,所有要求相叠加的所有数组维度一样。
a = np.array([1,2,3])
b = a.repeat(3)
c = np.tile(a ,3)
bc_h = np.hstack((b, c))
bc_v = np.vstack((b, c))
bc_h: [1 1 1 2 2 2 3 3 3 1 2 3 1 2 3 1 2 3]
bc_v: [[1 1 1 2 2 2 3 3 3]
[1 2 3 1 2 3 1 2 3]]
d = np.arange(9).reshape(1,9)
bcd_h = np.hstack((b, c, d))
会报错
bcd_v = np.vstack((b, c, d))
‘’‘bcd_v: [[1 1 1 2 2 2 3 3 3]
[1 2 3 1 2 3 1 2 3]
[0 1 2 3 4 5 6 7 8]]’‘’
六. np数组的运算
1.逻辑比较
- np数组的逻辑比较都是遍历元素的比较。
arr2 = np.arange(9)
condition = arr2 < 3`
condition返回一个bool数列
[ True True True False False False False False False]
arr2[condition]会检索返回对应下标为True的元素
2.where函数运算
arr2 = np.arange(9),reshape(3,3)
index = np.where(arr2>3)
返回满足条件的对应元素的索引[rows, clos]
还可进行三元运算
arr3 = np.where(arr2>3, 3, arr2)
即 3 if arr2>3 else arr2
3.数组元素的修改
arr3 = np.zeros((3, 3)) #zeros和ones默认为float类型
arr3[0][0] = 4
#即使赋值int,任为float
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TGUsfGmy-1653298972899)(script/20220523162547.png)]
因为赋值仅改变数列中的值,数列header中的data-type并未发生改变
arr4 = np.arange(9).reshape(3,3)
arr3 = arr4
#arr3指向发生改变,指向arr4
可以对指定条件下的数组元素进行赋值
arr3[arr3>3] = 3
也可以使用where函数
arr3 = np.wehere(arr3>3, 3, arr3)
4.数组的轴转换
arr1 = np.arange(8).reshape(4, 2)
arr1_t = np.transpose(arr1, [1, 0])# [1, 0]为轴的索引号列表
(4,2)中4对应第0轴,2对应第1轴
transpose的轴转换与reshape的数组重组(按存储顺序)并不相同
5.矩阵乘与矩阵元素相乘
arr1 = np.arange(8).reshape(4, 2)# (4, 2) (2, 4)
arr2 = arr1.T # (2, 4)
res1 = arr1 @ arr2
#(4, 4) 即np.dot(arr1,arr2)
res2 = arr1 * arr1 # 对应元素相乘,即np.multiply(arr1, arr1)
shape不相同也会广播
三维甚至高维的矩乘,也仅是仅是最后两个轴上(行列)的矩乘,前面低位的轴元素不同时进行广播。
shape为(1,2,3,4) 与 (2, 1, 4, 3) 矩阵乘结果:(2,2,3,3)
最后
以上就是俏皮小笼包为你收集整理的numpy总结一.快速创建numpy数组二.切片以及索引三.广播 broadcast四.np.r_以及np.c_#五. hstack以及vstack六. np数组的运算的全部内容,希望文章能够帮你解决numpy总结一.快速创建numpy数组二.切片以及索引三.广播 broadcast四.np.r_以及np.c_#五. hstack以及vstack六. np数组的运算所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复