栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

numpy总结

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

numpy总结

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. 看形状:从右往左看而且只需要看最短的。
  2. 对应位置的元素要么相同,要么其中一个为1。

广播的规则:
  1. 维度不同时,最高维为输出的最终维度。
  2. 不够最终维度的数组,要往前面扩维度。
  3. 同维度的元素个数,要么相同,要么其中一个为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
  1. 在进行vstack叠加时,默认将一维数组元素变成了二维。
  2. 但是二维与三维叠加,二维不会变成三维。即一维可以与二维可以进行vstack
  3. 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.逻辑比较
  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)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/926279.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号