numpy总结

一.快速创建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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值