NPM(更新中)

numpy

tips:

image

核心特性

  • 多维性:支持0维,1维,2维及更高维数组
arr = np.array(5) # 创建0维数组
arr = np.array([1,2,3]) # 创建1维数组
arr = np.array([[1,2,3],[4,5,6]]) # 创建2维数组
arr.ndim # 数组的维度
  • 同质性:所有元素类型必须一致(通过dtype指定)
arr = np.array([1,'123']) # 不同数据类型会被强制转换成相同数据类型
arr = np.array([1,1.5]) 
arr

\(output\):
array(['1', '123'] array([1. , 1.5])

  • 高效性:基于连续内存块存储,支持向量化运算

属性

  1. \(shape\):数组的形状(行数/列数)
  2. \(ndim\):维度数量
  3. \(size\):总元素个数
  4. \(dtype\):数组中元素的类型
  5. \(T\):转置(行变列,列变行)
  6. \(itemsize\):单个元素占用的内存字节数
  7. \(nbytes\):数组总内存占用量
  8. \(flags\):内存存储方式(是否连续存储)

ndarray的创建

基础创建方式

# 基础创建方式
list1 = [1,2,3]
arr = np.array(list1,dtype = int)
print(arr.ndim)
arr

copy

arr1 = np.copy(arr) # 元素跟原始的数组相同,但不是同一个数组
arr1[0] = 8
print(arr1)
print(arr)

预定义形状

# 预定义形状
# 全0  全1 未初始化 固定值
# 全0
arr = np.zeros((2,3))

# 全1
arr = np.ones((2,3),dtype = int)
print(arr)

# 未初始化(值随机)
arr = np.empty((2,3))
print(arr)

# 固定值
arr = np.full((3,4),2,dtype = int)
print(arr)

# 规定形状与谁一样
arr1 = np.zeros_like(arr)
arr1 = np.empty_like(arr)
arr1 = np.full_like(arr,2025,dtype = int)
arr1

等差数列

arr = np.arange(1,12,2).reshape(3,2)
arr

\(op\):

array([[ 1,  3],
       [ 5,  7],
       [ 9, 11]])

等间隔数列

# 等间隔数列
app = np.linspace(0,100,5)
app

\(op\):

array([  0.,  25.,  50.,  75., 100.])

对数间隔数列

# 对数间隔
arr = np.logspace(0,4,3,base = 2)
arr

\(op\):

array([ 1.,  4., 16.])

base表示以几为底,0-4 分成3份

单位矩阵

# 特殊矩阵
# 单位矩阵:主对角线上的数字为1,其他数字为0
arr = np.eye(3) # 3行3列
arr

# 非单位矩阵
arr = np.eye(3,4,dtype=int) # 3行4列
print(arr)

\(op\):

[[1 0 0]
 [0 1 0]
 [0 0 1]
 
[[1 0 0 0]
 [0 1 0 0]
 [0 0 1 0]]

对角矩阵

# 对角矩阵 主对角线上非零,其他数字为0
arr = np.diag([1,2,3])
print(arr)

\(op\):

[[1 0 0]
 [0 2 0]
 [0 0 3]]

随机数组

# 随机数组的生成
# 生成0-1之间的随机浮点数(均匀分布)
arr = np.random.rand(2,3)
print(arr)

# 生成指定范围区间的随机浮点数
arr = np.random.uniform(3,6,(2,3))
print(arr)

# 生成指定范围区间的随机整数
arr = np.random.randint(3,6,(2,3))
print(arr)

# 生成随机数列(正态分布)
# 两边概率小,中间概率大
# -3 ~ 3 之间
arr = np.random.randn(2,3)
print(arr)

# 随机种子
# 每次运行随机的结果一样
np.random.seed(20)
arr = np.random.randint(1,10,(2,5))
print(arr)

\(op\):

[[0.03662698 0.05935025 0.96815315]
 [0.93762998 0.32943142 0.73241407]]
 
[[3.78802835 5.67615818 4.12618184]
 [4.06410551 5.52066818 4.71513323]
 
[[4 3 4]
 [4 5 5]]

[[ 0.99595732 -0.01888541 -0.43937749]
 [-0.08584057  1.55598342  1.8797463 ]]
 
[[4 5 7 8 3]
 [1 7 9 6 4]]

ndarray数据类型

image


索引与切片

一维数组

arr = np.random.randint(1,100,20)
# 基本索引
print(arr[0])
print(arr[1])

# 切片(左闭右开)
print(arr[:]) # 全部
print(arr[:5]) # 0 ~ 4索引
print(arr[2:5]) # 2 ~ 4
print(arr[1:]) # 1 ~ 到最后

# 布尔索引
print(arr[arr > 10]) # 打印arr中大于10的所有元素
print(arr[(arr > 10) & (arr < 70)]) # 打印arr中大于10小于70的所有元素

# slice
# 与切片作用完全一样,这个只不过是用函数里面传参数
arr[slice(2,5)] # 2 ~ 4下标元素
print(arr[slice(0,6,3)]) # 0 ~ 5 步长为3

二维数组

arr = np.random.randint(1,100,(4,8))

# 基础索引
print(arr[1][2]) # 2行3列
print(arr[0][0]) # 1行1列

# 切片
print(arr[:3,:2]) # 0 ~ 2行 0 ~ 1列
print(arr[1:3,2:5]) # 1 ~ 2行 2 ~ 4列

# 布尔索引
print(arr[arr > 40]) # 转换成1维列表
print(arr[2][arr[2] > 50]) # 2行中大于50的元素
print(arr[:,3][arr[:,3] > 10]) # 3列中大于10的元素

ndarray运算

数组与数组之间运算:

# np数组运算 
# 一维
a = np.array([1,2,3])
b = np.array([4,5,6])
print(a + b)
print(a - b)
print(a * b)
print(a / b)

#二维
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[4,5,6],[7,8,9]])
print(a + b)
print(a - b)
print(a * b)
print(a / b)

# 原生py
c = [1,2,3]
d = [4,5,6]
print(c + d)

\(op\):

[5 7 9]
[-3 -3 -3]
[ 4 10 18]
[0.25 0.4  0.5 ]

[[ 5  7  9]
 [11 13 15]]
[[-3 -3 -3]
 [-3 -3 -3]]
[[ 4 10 18]
 [28 40 54]]
[[0.25       0.4        0.5       ]
 [0.57142857 0.625      0.66666667]]
 
[1, 2, 3, 4, 5, 6]

数字与数组的运算

# 数组与标量之间的算数运算
a = np.array([[1,2,3],[4,5,6]])
print(a + 3)
print(a * 3)

\(op\):

[[4 5 6]
 [7 8 9]]
[[ 3  6  9]
 [12 15 18]]

数组中每个元素都加上/乘数字

广播机制(不同形状数组之间的运算)

  1. 先看同一维度 如果相同/有一个为1 便可以广播
  2. 如何广播:
    [1 2 3] -> [[1,2,3],[1,2,3],[1,2,3]]
    [[4],[5],[6]] -> [[4,4,4],[5,5,5],[6,6,6]]
  3. 同形状之后进行运算
a = np.array([1,2,3])
b = np.array([[4],[5],[6]])
print(a + b)
print(a - b)

op:
[[5 6 7]
 [6 7 8]
 [7 8 9]]
[[-3 -2 -1]
 [-4 -3 -2]
 [-5 -4 -3]]

1 * 3和1 * 2就不可以广播


矩阵运算

# 矩阵运算
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[4,5,6],[7,8,9],[1,2,3]])
print(a @ b)

op:
[[ 21  27  33]
 [ 57  72  87]
 [ 93 117 141]]

基本数学函数

# 计算平方根
print(np.sqrt(9))
print(np.sqrt([1,4,9]))

# 计算指数 以e^x为底
print(np.exp(1))

# 计算对数 lnX
print(np.log(1))

# 计算正弦值,余弦值
print(np.sin(-1))
print(np.cos(-1))

# 计算绝对值
print(np.abs(-2))

# 计算a的b次幂
print(np.power([1,2,3],2))
print(np.power([1,2,3],3))

# 四舍五入
# 4.5 -> 4
# 4.56 -> 5
print(np.round([3.2,4.5,8.1,9.6]))

# 向上/下取整
arr = np.array([1.6,25.1,81.7])
print(np.ceil(arr))
print(np.floor(arr))

# 检测缺失值Nan
np.isnan([1,2,3,np.nan,3])

op:
3.0
[1. 2. 3.]

2.718281828459045

0.0

-0.8414709848078965
0.5403023058681398

2

[1 4 9]
[ 1  8 27]

[ 3.  4.  8. 10.]

[ 2. 26. 82.]
[ 1. 25. 81.]

array([False, False, False,  True, False])

统计函数

# 求和
print(np.sum(arr))
print(np.sum([1,2,3]))

# 计算平均值
print(np.mean(arr))
print(np.mean([1,2,3]))

# 计算中位数
# 奇数:排序后中间的数值
# 偶数:排序后中间两个数的平均值
print(np.median([4,1,2]))
print(np.median([1,2,4,8]))

# 计算标准差,方差
# 计算平均值
# 计算 方差 = (xi - avg)^2 + ... / n
# 标准差 = 方差开根
print(np.var([1,2,3]))
print(np.std([1,2,3]))

# 计算最大值/最小值
print(np.max(arr))
print(np.min(arr))

# 计算索引值
print(np.argmax(arr))
print(np.argmin(arr))

# 计算分位数
np.percentile(arr,100)

# # 前缀和/积数组,
arr = np.array([1,2,3])
print(np.sum(arr))
print(np.cumsum(arr))
print(np.cumprod(arr))

op:
98
6

12.25
2.0

2.0
3.0

0.6666666666666666
0.816496580927726

19
5

6
1

np.float64(19.0)

6
[1 3 6]
[1 2 6]


比较函数

# 是否大于
print(np.greater([3,4,5,6,7],4))
# 是否小于
print(np.less([3,4,5,6,7],4))
# 是否等于
print(np.equal([3,4,5,6,7],[3,4,5,6,7]))

# 逻辑与或非
print(np.logical_and([0,0],[1,5]))
print(np.logical_or([0,0],[1,5]))
print(np.logical_not([1,5]))

# 检查元素是否至少有一个元素为True
print(np.any([0,0,0,0]))
# 检查元素是否全部都是True
print(np.all([0,1,0,0]))

# 自定义条件 支持嵌套
arr = np.array([1,2,3,4,5])
print(np.where(arr > 3,arr,0))

# np.select(条件,返回的结果)
print(np.select([arr > 3,arr < 3],[0,1]))

op:
[False False  True  True  True]
[ True False False False False]
[ True  True  True  True  True]

[False False]
[ True  True]
[False False]

False
False

[0 0 0 4 5]

[1 1 0 0 0]

排序函数

# 排序函数
np.random.seed(0)
arr = np.random.randint(1,100,20)
print(arr)
print(np.sort(arr)) 
print(np.argsort(arr)) # 排序后的元素在原数组中的下标
print(arr)

# 去重+排序函数
print(np.unique(arr))

# 数组拼接
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
print(arr1 + arr2)
print(np.concatenate((arr1,arr2)))

# 数组的分割 必须整除
print(np.split(arr1,3))

# 调整数组形状
print(np.reshape(arr,[2,10]))
print(np.reshape(arr,[5,4]))

op:
[45 48 65 68 68 10 84 22 37 88 71 89 89 13 59 66 40 88 47 89]
[10 13 22 37 40 45 47 48 59 65 66 68 68 71 84 88 88 89 89 89]
[ 5 13  7  8 16  0 18  1 14  2 15  3  4 10  6  9 17 11 12 19]
[45 48 65 68 68 10 84 22 37 88 71 89 89 13 59 66 40 88 47 89]

[ 2  6  7 10 12 13 17 19 21 26 29 38 51 65 72 73 76 77 80 85]

[5 7 9]
[1 2 3 4 5 6]

[array([1]), array([2]), array([3])]

[[45 48 65 68 68 10 84 22 37 88]
 [71 89 89 13 59 66 40 88 47 89]]
[[45 48 65 68]
 [68 10 84 22]
 [37 88 71 89]
 [89 13 59 66]
 [40 88 47 89]]

pandas

series

series创建

# series创建
import pandas as pd
s = pd.Series([20,1,2,3,4])

# 自定义索引
s = pd.Series([10,2,3,4,5], index=['a','b','c','d','e'])
s = pd.Series([10,2,3,4,5], index=['1','2','3','4','5'])

# 定义name(描述这一列是什么意思的)
s = pd.Series([10,2,3,4,5], index=['1','2','3','4','5'],name = '月份')

# 通过字典方式创建
s = pd.Series({'a':1,'b':2,'c':3,'d':4,'e':5})

# 从原来列表基础上获取
s1 = pd.Series(s,index=['a','c'])

op:
0    20
1     1
2     2
3     3
4     4
dtype: int64
1    10
2     2
3     3
4     4
5     5
dtype: int64
1    10

a    1
b    2
c    3
d    4
e    5
dtype: int64
a    1
c    3
dtype: int64

series属性

image

显式可以用自定义索引去获取元素,隐式则是按照下标来获取

  • 显示中\(loc\)支持切片(两边均闭),\(at\)不支持切片

  • 隐式支持切片(左闭右开)

访问元素

# 访问数据
# print(s[0]) # 可能会跟你自定义索引混淆不推荐使用
print(s['a']) # 用自定义索引
print(s[s < 3]) # 布尔索引
print(s.head()) # 返回数据前五行信息
s['f'] = 6 # 添加元素
print(s.tail()) # 返回数据后5行

常用方法

image

image

DataFrame

创建

# 通过series创建
s1 = pd.Series([1,2,3,4,5])
s2 = pd.Series([6,7,8,9,10])
df = pd.DataFrame({'第一列':s1,'第二列':s2})
print(df)

# 通过字典来创建
df = pd.DataFrame(
    {
        "name":['tom','jack','Eric','Apple','Faker'],
        'age':[12,23,24,24,25],
        'score':[32,36,87,68,89]
    },index=[1,2,3,4,5],columns=['name','score','age']
)
df

\(op\):

image

image

属性

image

访问数据

# 获取单列数据
print(df['score'])
df.score

# 获取多列数据
df[['name','score']]

# 布尔索引(数据筛选)
print(df[df.score > 60])
print(df[(df.score > 60) & (df.age < 30)])

op:

image
image
image

常用方法

image

image

数据分析步骤

  1. 数据收集
  2. 数据清洗
  3. 数据分析
  4. 数据可视化

数据导入/导出

# 导入csv文件
import pandas as pd
df = pd.read_csv('文件路径')

# 导出csv文件
df.to_csv('文件路径')

# 导入json文件
# 1. pd读json
df = pd.read_json('')

# 2. json工具包
import json
with open('') as f:
    data = json.load(f)
df = pd.DataFrame(data['data'])
posted @ 2025-10-19 20:27  Gabriel_7  阅读(0)  评论(0)    收藏  举报