【Numpy】13 基本运算

【Numpy】13 基本运算

2023.1.3 numpy中,加减乘除、数据分析的一些函数、关于维度的一些函数

13.1 加减乘除

13.1.1 ±*/

  • 加减乘除都是批量操作
import numpy as np

a = np.array([150, 166, 183, 170])
print("a + 3:", a + 3)
print("a - 3:", a - 3)
print("a * 3:", a * 3)
print("a / 3:", a / 3)
a + 3: [153 169 186 173]
a - 3: [147 163 180 167]
a * 3: [450 498 549 510]
a / 3: [50.         55.33333333 61.         56.66666667]
  • 高维+-*/都是对应元素运算
a = np.array([
[1, 2],
[3, 4]
])
b = np.array([
[5, 6],
[7, 8]
])

print("a + b:\n", a + b)
print("a - b:\n", a - b)
print("a * b:\n", a * b)
print("a / b:\n", a / b)
a + b:
 [[ 6  8]
 [10 12]]
a - b:
 [[-4 -4]
 [-4 -4]]
a * b:
 [[ 5 12]
 [21 32]]
a / b:
 [[0.2        0.33333333]
 [0.42857143 0.5       ]]

13.1.2 矩阵乘法np.dot()

  • 你有两种写法。1)直接用一个矩阵 dot 另一个;2)用 np.dot(a, b) 把两个矩阵包起来。
  • 矩阵还有很多其他的计算,比如 np.outer() 矩阵外积,np.inner() 矩阵内积 (和 np.dot() 的用法稍稍有些不同,你可以理解成 np.dot(a, b)= np.inner(a, b.T), 把 b 做一次转置)。
a = np.array([
[1, 2],
[3, 4]
])
b = np.array([
[5, 6],
[7, 8]
])

print(a.dot(b))
print(np.dot(a, b))
[[19 22]
 [43 50]]
[[19 22]
 [43 50]]

13.2 数据统计分析

13.2.1 np.max() np.min() np.sum() np.prod() np.count()

  • np.max() np.min():找到最大值最小值了
a = np.array([
[1, 2],
[3, 4]
])

print("最大:", np.max(a))
print("最小:", a.min())
最大: 4
最小: 1
  • np.sum():所有值累加
print(a.sum())
10
  • np.prod():累乘
print("累乘:", a.prod())
print("总数:", a.size)  
累乘: 24
总数: 4

13.2.2 np.std() np.mean() np.median()

均值,中位数

month_salary = [1.2, 20, 0.5, 0.3, 2.1]
print("平均工资:", np.mean(month_salary))
print("工资中位数:", np.median(month_salary))
平均工资: 4.82
工资中位数: 1.2

standard deviation 标准差,用来描述正态分布

month_salary = [1.2, 20, 0.5, 0.3, 2.1]
print("标准差:", np.std(month_salary))
标准差: 7.61614075500184

13.2.3 特殊运算符号

13.2.3.1 np.argmax() np.argmin()

其实你不关心 np.max() 或者 np.min() 的数值是多少,而是关心对应的谁
np.argmax()np.argmin() 就能搞定。其实返回的是坐标

  • 1维数据
a = np.array([150, 166, 183, 170])
print("最大坐标:", np.argmax(a))
print("最小坐标:", np.argmin(a))
最大坐标: 2
最小坐标: 0
  • 对2维向量(通常意义下的矩阵)a[][],我们发现这种方法是错误的
b = np.array([
[11, 211],
[31, 41]
])

print("最大:", np.argmax(b))
print("最小:", np.argmin(b))
最大: 1
最小: 0

所以要只能哪个方向的

b = np.array([
[11, 211],
[31, 41]
])

print("每列最大:", np.argmax(b,axis=0))
print("每行最大:", np.argmax(b,axis=1))
每行最大: [1 0]
每列最大: [1 1]

第一列最大是31,所以返回1;第二列最大211,所以返回0

13.2.3.2 np.ceil() np.floor() np.clip()

  • 向上取、向下取
a = np.array([150.1, 166.4, 183.7, 170.8])
print("ceil:", np.ceil(a))
print("floor:", np.floor(a))
ceil: [151. 167. 184. 171.]
floor: [150. 166. 183. 170.]
  • 我可以用 np.clip() 来做上下界限的值截取。

也就是低过阈值或高于阈值 用上下限代替

a = np.array([150.1, 166.4, 183.7, 170.8])
print("clip:", a.clip(160, 180))
clip: [160.  166.4 180.  170.8]

13.3 关于维度

13.3.1 重要,关于axis的理解

https://blog.csdn.net/weixin_41261833/article/details/103762874

最关键信息就是:

  • 0是最高纬度、1是较高纬度… ;数字越大,相对维度越低;并不是特定值行还是列,是随着数据变化,所代表的也在变化

  • axis=0 :就是沿最高维度的方向改变,其他维度不变

  • 【实例讲解】

x=np.arange(24).reshape(2,3,4)
x
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
print(x.sum(axis=0),x.sum(axis=0).shape)
[[12 14 16 18]
 [20 22 24 26]
 [28 30 32 34]] (3, 4)

【老羊讲解】

  • (2,3,4)2是最高维,所以axis=0时,只有最高维变化(消失)。
  • 另一种理解是,最高维是[[A],[B]],那我们求sum,就是A,B每项对应相加。
print(x.sum(axis=1),x.sum(axis=1).shape)
[[12 15 18 21]
 [48 51 54 57]] (2, 4)

【老羊讲解】

  • (2,3,4)3是次高维,所以axis=1时,只有次高维变化(消失)。
  • 另一种理解是,axis=1,就是对【列方向】上变化,就是对【列方向】求sum
print(x.sum(axis=2),x.sum(axis=2).shape)
[[ 6 22 38]
 [54 70 86]] (2, 3)

【老羊讲解】

  • (2,3,4)4最低维,所以axis=2时,只有最低维变化(消失)。
  • 另一种理解是,axis=2,就是对【行方向】上变化,就是求【行方向】sum

13.3.2 数据处理

13.3.3.1 查看数据array.ndim、array.size、array.shape

cars = np.array([
[5, 10, 12, 6],
[5.1, 8.2, 11, 6.3],
[4.4, 9.1, 10, 6.6]
])

print("数据:\n", cars, "\n维度:", cars.ndim)
数据:
 [[ 5.  10.  12.   6. ]
 [ 5.1  8.2 11.   6.3]
 [ 4.4  9.1 10.   6.6]] 
维度: 2
print("总共多少测试数据:", cars.size)
总共多少测试数据: 12
print("第一个维度:", cars.shape[0])
print("第二个维度:", cars.shape[1])
print("所有维度:", cars.shape)
第一个维度: 3
第二个维度: 4
所有维度: (3, 4)

13.3.3.2 np.concatenate()、np.expand_dims()

  • np.concatenate():默认是在最高纬度上添加
test1 = np.array([5, 10, 12, 6])
test2 = np.array([5.1, 8.2, 11, 6.3])

# 首先需要把它们都变成二维,下面这两种方法都可以加维度
test1 = np.expand_dims(test1, 0)
test2 = test2[np.newaxis, :]

print("test1加维度后 ", test1)
print("test2加维度后 ", test2)

# 然后再在第一个维度上叠加
all_tests = np.concatenate([test1, test2])
print("括展后\n", all_tests)
test1加维度后  [[ 5 10 12  6]]
test2加维度后  [[ 5.1  8.2 11.   6.3]]
括展后
 [[ 5.  10.  12.   6. ]
 [ 5.1  8.2 11.   6.3]]
  • 也可以在指定轴方向上添加
print("第一维度叠加:\n", np.concatenate([all_tests, all_tests], axis=0))
print("第二维度叠加:\n", np.concatenate([all_tests, all_tests], axis=1))
第一维度叠加:
 [[ 5.  10.  12.   6. ]
 [ 5.1  8.2 11.   6.3]
 [ 5.  10.  12.   6. ]
 [ 5.1  8.2 11.   6.3]]
第二维度叠加:
 [[ 5.  10.  12.   6.   5.  10.  12.   6. ]
 [ 5.1  8.2 11.   6.3  5.1  8.2 11.   6.3]]
  • np.concatenate():**这种方法就是维度要对其,对不其合并失败报错
a = np.array([
[1,2,3],
[4,5,6]
])
b = np.array([
[7,8],
[9,10]
])

print(np.concatenate([a,b], axis=1))  # 这个没问题
 print(np.concatenate([a,b], axis=0))  # 这个会报错

13.3.3.3 np.vstack()、np.hstack()

np.concatenate(),还有两个比较好用的在二维数据上可以方便调用的功能,分别是 np.vstack(), np.hstack().

a = np.array([
[1,2],
[3,4]
])
b = np.array([
[5,6],
[7,8]
])
print("竖直合并\n", np.vstack([a, b]))
print("水平合并\n", np.hstack([a, b]))
竖直合并
 [[1 2]
 [3 4]
 [5 6]
 [7 8]]
水平合并
 [[1 2 5 6]
 [3 4 7 8]]

你可能感兴趣的:(python学习,numpy,python)