深入解析:numpy学习笔记
一、ndarray
1.ndarray的特性
多维性
import numpy as np
arr = np.array(5) # 创建0维的ndarray数组
print(arr)
print('arr的维度:', arr.ndim) # 数组的维度number of dimensions
5
arr的维度: 0
arr = np.array([1, 2, 3]) # 创建1维的ndarray数组
print(arr)
print('arr的维度:', arr.ndim) # 数组的维度number of dimensions
[1 2 3]
arr的维度: 1
arr = np.array([ [1, 2, 3], [4, 5, 6]]) # 创建2维的ndarray数组
print(arr)
print('arr的维度:', arr.ndim) # 数组的维度number of dimensions
[[1 2 3]
[4 5 6]]
arr的维度: 2
同质性
arr = np.array([1, 'hello']) # 不同的数据类型会被强制转换成相同的数据类型
print(arr)
['1' 'hello']
arr = np.array([1, 2.5]) # 不同的数据类型会被强制转换成相同的数据类型
print(arr)
[1. 2.5]
2.ndarray的属性
arr = np.array(1)
print(arr)
print('数组的形状:', arr.shape)
print('数组的维度:', arr.ndim)
print('元素的个数:', arr.size)
print('元素的数据类型:', arr.dtype)
print('元素的转置', arr.T)
1
数组的形状: ()
数组的维度: 0
元素的个数: 1
元素的数据类型: int64
元素的转置 1
arr = np.array([1, 2.5, 3])
print(arr)
print('数组的形状:', arr.shape)
print('数组的维度:', arr.ndim)
print('元素的个数:', arr.size)
print('元素的数据类型:', arr.dtype)
print('元素的转置', arr.T)
[1. 2.5 3. ]
数组的形状: (3,)
数组的维度: 1
元素的个数: 3
元素的数据类型: float64
元素的转置 [1. 2.5 3. ]
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print('数组的形状:', arr.shape)
print('数组的维度:', arr.ndim)
print('元素的个数:', arr.size)
print('元素的转置', arr.T)
[[1 2 3]
[4 5 6]]
数组的形状: (2, 3)
数组的维度: 2
元素的个数: 6
元素的转置 [[1 4]
[2 5]
[3 6]]
3.ndarray的创建
# 基础的创建方法
list1 = [4, 5, 6]
arr = np.array(list1,dtype=np.float64)
print(arr.ndim) # 属性
print(arr)
1
[4. 5. 6.]
# copy
arr1 = np.copy(arr) # 元素跟原始的数组相同,但是不是一个数组了
print(arr1)
arr1[0] = 8
print(arr1)
print(arr)
[4. 5. 6.]
[8. 5. 6.]
[4. 5. 6.]
# 预定义形状
# 全0 全1 未初始化 固定值
# 全0
arr = np.zeros((2,3),dtype=int)
print(arr)
print(arr.dtype)
[[0 0 0]
[0 0 0]]
int64
arr = np.zeros((200,),dtype=int)
print(arr)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# 全1
arr = np.ones((5,8),dtype=int)
print(arr)
[[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]]
# 未初始化
# empty 不会初始化数组里的值,只是在内存里直接分配一块空间
arr = np.empty((2,3))
print(arr)
[[-0.59697917 0.30601791 0.7768145 ]
[-0.466596 -0.43245674 -2.02942807]]
arr = np.empty((4, 2))
print(arr)
[[4.67296746e-307 1.69121096e-306]
[4.67293691e-307 1.42413555e-306]
[1.78019082e-306 1.37959740e-306]
[6.23057349e-307 1.42419530e-306]]
arr = np.full((3,4),2025)
print(arr)
[[2025 2025 2025 2025]
[2025 2025 2025 2025]
[2025 2025 2025 2025]]
arr1 = np.zeros_like(arr)
print(arr1)
arr1 = np.empty_like(arr)
print(arr1)
arr1 = np.ones_like(arr)
print(arr1)
arr1 = np.full_like(arr,2026)
print(arr1)
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[ 2396494551320 50 0
0]
[ 31525476564467712 3543889139687646571 3271357366328833378
7077182708142924082]
[7002360972756725044 3618980067091362352 8386112019189097778
4123107242771247989]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[2026 2026 2026 2026]
[2026 2026 2026 2026]
[2026 2026 2026 2026]]
# 等差数列 2 4 6 8 10
arr = np.arange(1, 51, 1) # start,end,step(步长)
print(arr)
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
49 50]
# 等间隔数列
arr = np.linspace(0,100,5)
print(arr)
[ 0. 25. 50. 75. 100.]
# 含义:在 [start, stop] 区间内,等间距生成 num 个数(包含 stop)。
# 这里:start=0, stop=100, num=5 → 把 [0,100] 分成 4 段
arr = np.linspace(0,100,5,dtype=int)
print(arr)
# start=0, stop=101, step=25 → 从 0 开始,每次加 25,直到 ≥101 停止
arr = np.arange(0,101, 25)
print(arr)
[ 0 25 50 75 100]
[ 0 25 50 75 100]
# 对数间隔数列
# np.logspace(start, stop, num, base=10)
# 在对数刻度下,生成 num 个数。
# 生成的是:base ** start 到 base ** stop 之间的等比数列
arr = np.logspace(0,4,3,base=2)
print(arr)
[ 1. 4. 16.]
# np.linspace(start, stop, num)
# 在 [start, stop] 闭区间里,等间距取 num 个点。
arr = np.linspace(0,4,3)
print(arr)
[0. 2. 4.]
arr = np.logspace(0,4,3)
print(arr)
[1.e+00 1.e+02 1.e+04]
# 特殊矩阵
# 单位矩阵:主对角线上的数字为1,其他的数字为0
arr = np.eye(3,4,dtype=int)
print(arr)
[[1 0 0 0]
[0 1 0 0]
[0 0 1 0]]
# 对角矩阵:主对角线上非零的0,其他的数字为0
# arr = np.diag([5,1,2,3])
arr=np.diag([1,2,3,4])
print(arr)
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
# 随机数组的生成
# 生成0到1之间的随机浮点数(均匀分布)
arr = np.random.rand(2,3)
print(arr)
[[0.85199297 0.06536195 0.83019394]
[0.07373522 0.91461023 0.4366306 ]]
# 生成指定范围区间的随机浮点数
arr = np.random.uniform(3, 6,(2,3))
print(arr)
[[5.6837298 4.28723629 3.49872665]
[4.06417994 4.27914786 4.01241922]]
# 生成指定范围区间的随机整数
arr = np.random.randint(3, 30,(2,3))
print(arr)
[[ 8 13 14]
[18 25 7]]
# 生成随机数列(正态分布)(-3到3之间)
# 两边小,中间大
# 值大多数集中在 0 附近(中间大);
# 离 0 越远的数出现概率越小(两边小)。
# 理论上值域是 (-∞, +∞),不是严格限制在 [-3, 3]。
arr = np.random.randn(2,3)
print(arr)
[[ 0.93946935 -0.97848104 0.50309684]
[ 0.40641447 0.32346101 -0.49341088]]
# 设置随机种子
# 设置随机数种子为 20,当然其实可以是任意数
# 这样每次运行代码都会得到相同的随机结果
np.random.seed(20)
# 这里是 1 ≤ 随机数 < 10,即从 1 到 9。
# size=(2,5) 表示生成一个 2 行 5 列 的数组。
arr = np.random.randint(1,10,(2,5))
print(arr)
[[4 5 7 8 3]
[1 7 9 6 4]]
# dtype='i8':指定数组的数据类型。
# i 代表 整数 (signed integer)。
# 8 表示 8 字节(64 位)。
# 所以 i8 就是 int64。
arr = np.array([1,2,3],dtype='i8')
print(arr)
[1 2 3]
- ndarray的数据类型
布尔类型 bool
整数类型 int uint
浮点数 float
复数 complex
arr = np.array([1,0,127,0],dtype= np.int8)
print(arr)
[ 1 0 127 0]
- 索引与切片
# 一维数组的索引与切片
arr = np.random.randint(1,100,20)
print(arr)
[17 63 17 8 99 7 27 14 76 59 26 4 75 76 62 78 84 58 95 33]
print(arr[10])
print(arr[:]) # 获取全部的数据
print(arr[2:5]) # start:end+1 左包右不包
print(arr[slice(2,15,3)]) #start,end,step
print(arr[ (arr>
10) &
(arr<
70) ]) # 布尔索引
26
[17 63 17 8 99 7 27 14 76 59 26 4 75 76 62 78 84 58 95 33]
[17 8 99]
[17 7 76 4 62]
[17 63 17 27 14 59 26 62 58 33]
# 二维数组的索引与切片
arr = np.random.randint(1,100,(4,8))
print(arr)
[[11 7 76 19 4 78 18 44]
[17 19 80 91 60 72 76 30]
[46 7 64 79 25 19 94 34]
[79 43 95 4 19 71 53 23]]
print(arr[1,3]) # 索引
print(arr[ 1,2:5])
print(arr[2][ arr[2] >
50 ])
print( arr[:,3] )
91
[80 91 60]
[64 79 94]
[19 91 79 4]
- ndarray的运算
# 算术运算
a = np.array([1,2,3])
b = np.array([4,5,6])
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** 2)
[5 7 9]
[-3 -3 -3]
[ 4 10 18]
[0.25 0.4 0.5 ]
[1 4 9]
c = [1, 2, 3]
d = [4, 5, 6]
for i in range(len(c)):
d[i] = d[i]+c[i]
print(d)
[5, 7, 9]
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)
print(a - b)
print(a * b)
print(a / b)
print(a ** 2)
[[ 5 7 9]
[11 13 15]
[ 8 10 12]]
[[-3 -3 -3]
[-3 -3 -3]
[ 6 6 6]]
[[ 4 10 18]
[28 40 54]
[ 7 16 27]]
[[0.25 0.4 0.5 ]
[0.57142857 0.625 0.66666667]
[7. 4. 3. ]]
[[ 1 4 9]
[16 25 36]
[49 64 81]]
# 数组与标量之间的算术运算
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a + 3)
print(a * 3)
[[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 3 6 9]
[12 15 18]
[21 24 27]]
# 广播机制: 1.获取形状 2.是否可广播
# 同一维度:相同、1
a = np.array([1,2,3]) #1*3
b = np.array([[4],[5],[6]]) #3*1
print(b - a )
'''a
1 2 3
1 2 3
1 2 3
b
4 4 4
5 5 5
6 6 6
'''
[[3 2 1]
[4 3 2]
[5 4 3]]
'a\n 1 2 3\n 1 2 3\n 1 2 3\n b\n 4 4 4\n 5 5 5\n 6 6 6\n'
a = np.array([1,2,3]) #1*3
b = np.array([4,5]) #1*2
print(b - a )
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[43], line 3
1 a = np.array([1,2,3]) #1*3
2 b = np.array([4,5]) #1*2
----> 3 print(b - a )
ValueError: operands could not be broadcast together with shapes (2,) (3,)
# 矩阵运算
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)
[[ 21 27 33]
[ 57 72 87]
[ 93 117 141]]
'''a
1 2 3
4 5 6
7 8 9
b
4 5 6
7 8 9
1 2 3'''
'a\n1 2 3\n4 5 6\n7 8 9\nb\n4 5 6\n7 8 9\n\n1 2 3'
2.3 numpy中的常用函数
1. 基本数学函数
# 计算平方根
print(np.sqrt(9))
print(np.sqrt([1,4,9]))
arr = np.array([1,25,81])
print(np.sqrt(arr))
3.0
[1. 2. 3.]
[1. 5. 9.]
# 计算指数 e^x = y
print(np.exp(1))
2.718281828459045
# 计算自然对数 ln y = x
print(np.log(2.71))
0.9969486348916096
# 计算正弦值、余弦值
print(np.sin(np.pi/2))
print(np.cos(np.pi))
1.0
-1.0
# 计算绝对值
arr = np.array([-1, 1, 2, -3])
print(np.abs(arr))
[1 1 2 3]
# 计算a的b次幂
print(np.power(arr,3))
[ -1 1 8 -27]
# 四舍五入
print(np.round([3.2, 4.5, 8.1, 9.6]))
[ 3. 4. 8. 10.]
# 向上取整,向下取整
arr = np.array([1.6, 25.1, 81.7])
print(np.ceil(arr))
print(np.floor(arr))
[ 2. 26. 82.]
[ 1. 25. 81.]
# 检测缺失值NaN
np.isnan([1, 2, np.nan, 3])
array([False, False, True, False])
2.统计函数
求和、计算平均值、计算中位数、标准差、方差
查找最大值、最小值
计算分位数、累积和、累积差
arr = np.random.randint(1,200,8)
print(arr)
[143 5 28 76 9 7 27 83]
# 求和
print(np.sum([1,2,3]))
6
# 计算平均值
print(np.mean(arr))
47.25
# 计算中位数
# 奇数:排序后中间的数值
# 偶数:中间的两个数的平均值
print(np.median([4,1,2]))
print(np.median([1,1,1,1,1,1,1,1,1,100]))
2.0
1.0
# 计算标准差、方差
# 1,2,3 的平均值 2
# ((1-2)^2 + (2-2)^2 + (3-2)^2 )/ 3 = 0.666
arr1 = np.array([1,2,1,2,1,1,1,2])
arr2 = np.array([1,0,3,0,0,0,4,3])
print(np.mean(arr1))
print(np.mean(arr2))
print(np.var(arr1))
print(np.var(arr2))
1.375
1.375
0.234375
2.484375
# 计算最大值、最小值
print(arr)
print(np.max(arr), np.argmax(arr))
print(np.min(arr), np.argmin(arr))
[143 5 28 76 9 7 27 83]
143 0
5 1
# 分位数
# 中位数
# __________________
# 1 2 3 4
# 1 2 3
print(np.median([1,2,3]))
print(np.median([1,2,3,4]))
np.random.seed(0)
arr = np.random.randint(0,100,4)
print(arr)
# __________________
# 44 47 64 67
# (47+64)/2
print(np.median(arr))
print(np.percentile(arr,80))
# 0.25*3=0.75
# (47-44)*0.75=2.25 + 44 = 46.25
# 3*0.8 = 2.4
# (67-64)*0.4 = 1.2 + 64 = 65.2
2.0
2.5
[44 47 64 67]
55.5
65.2
# 累积和、累积积
arr = np.array([1,2,3])
print(np.sum(arr))
print(np.cumsum(arr))
print(np.cumprod(arr))
6
[1 3 6]
[1 2 6]
# 创建嵌套JSON结构的数据
import numpy as np
products = {
"products": [
{
"id": f"P{i
}",
"name": f"Product {i
}",
"category": np.random.choice(["Electronics", "Clothing", "Home", "Food"]),
"price": round(np.random.uniform(5, 200), 2),
"in_stock": np.random.choice([True, False]),
"specs": {
"weight": round(np.random.uniform(0.1, 5), 2),
"dimensions": {
"length": np.random.randint(5, 50),
"width": np.random.randint(5, 30),
"height": np.random.randint(5, 20)
}
}
} for i in range(1, 21)
]
}
# 保存为JSON
import json
with open('data/products.json', 'w') as f:
json.dump(products, f, indent=2)
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[66], line 25
23 # 保存为JSON
24 import json
---> 25 with open('data/products.json', 'w') as f:
26 json.dump(products, f, indent=2)
File D:\ProgramData\anaconda3\Lib\site-packages\IPython\core\interactiveshell.py:324, in _modified_open(file, *args, **kwargs)
317 if file in {0, 1, 2}:
318 raise ValueError(
319 f"IPython won't let you open fd={file} by default "
320 "as it is likely to crash IPython. If you know what you are doing, "
321 "you can use builtins' open."
322 )
--> 324 return io_open(file, *args, **kwargs)
FileNotFoundError: [Errno 2] No such file or directory: 'data/products.json'