数据处理中模块之numpy
目录
- 一、numpy模块
- 二、基础函数
- 2.1 算数运算
- 2.2 常用函数
- 2.2.1 numpy.linalg.norm(x)
- 2.2.2 numpy.log10(x)
- 2.2.3 numpy.nan_to_num
- 2.2.4 numpy.random.randn(d0, d1, …, dn)
- 2.2.5 numpy.random.normal(loc=0.0, scale=1.0, size=None)
- 2.2.6 numpy.random.random(size)
- 2.2.7 numpy.random.uniform(a,b)
- 2.2.8 random.randint(a, b)
- 2.2.9 random.randrange([start], stop[, step])
- 2.2.10 random.choice(sequence)
- 2.2.11 random.shuffle(x[, random])
- 2.2.12 len
- 2.2.13 numpy.squeeze(a, axis=None)
- 2.2.14 numpy.expand_dims(a, axis)
- 2.2.15 其他
- 2.3 索引、切片和迭代
- 三、代码下载
一、numpy
模块
Numpy
是Python
科学计算的基础包,它提供不了多维数组对象,基于数组的各种派生对象(例如掩码数组和矩阵),以及用于对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。
1.1 基础介绍
Numpy
的核心是ndarray
对象。一方面,ndarray
对象封装了可以包含相同数据类型的多维数组,另一方面,为了获得更好的性能,在ndarray
上的操作都是在编译过的代码上执行的,和Python
自身的序列对象相比,两者有如下区别:
Numpy
数组的大小是固定的,Python
的list
是可以动态增长的,改变Numpy
的大小会重新创建一个新的数组并把原来的删掉;Numpy
数组中的元素一定是同一类型的(相应地,每个元素所占的内存大小也是一样的),数组的维度被称为axes
,维数称为rank
;Numpy
数组支持在大量数据上进行数学计算和其他类型的操作,通常情况下与Python
自带序列相比,Numpy
数组上的操作执行更高效,代码量也更少;- 原来越多的
Python
科学计算都用到了Numpy
数组。虽然这些库支持Python
序列类型的输入,但是内部操作还是要先将其转换为Numpy
的数组类型,而且输出通常就是Numpy
数组。所以,如果你想要高效地使用这些Python
的科学计算包,仅仅知道Python
内建的序列类型是不够的,你还需要知道如何使用Numpy
数组。
1.2 重要属性
ndarray
的重要属性包括:
ndarray.ndim
:数组的维数,也称为rank
;ndarray.shape
:数组各维的大小,tuple
类型;对一个n
行m
列的矩阵来说,shape
为(n,m)
;ndarray.size
:元素的总数;ndarray.dtype
:每个元素的类型,可以是numpy.int32
、numpy.int16
、numpy.float64
、numpy.bool
、numpy.complex128
等;ndarray.itemsize
:数组中每一个元素分别所占空间的大小;ndarray.data
:指向数据内存;
1.2.1 简单示例
有许多种方法生成数组。比如,可以将Python list
或 tuple
转化为数组,转化后的数组元素的类型由原来的对象的类型来决定;
import numpy as np
a = np.array([1,2,3,4])
print(a) # [1 2 3 4]
print(a.dtype) #每个元素的类型 int32
print(a.shape) #数组各维的大小 (4,)
b = np.array([1.2,3.4,5.6,5])
print(b) [1.2 3.4 5.6 5. ]
print(b.dtype) [1.2 3.4 5.6 5. ]
#指定数据类型
c = np.array( [ [1,2], [3,4] ], dtype=complex )
print(c) #[[1.+0.j 2.+0.j][3.+0.j 4.+0.j]]
print(c.dtype) # complex128
1.2.2 生成固定大小数组
我们无法事先知道数组元素的具体值,但是数组大小是已知的。 这时可以用下面几种方法生成数组。 默认的,生成的数组的元素类型为float64
。
#zeros 函数生成元素全部为0的数组,
print(np.zeros((3,4)))
#empty函数生成元素没有赋值的数组,这时元素值由内存中原来的内容决定。
print(np.empty((2,3)))
#ones函数生成元素全部为1的数组
print(np.ones((2,3,4),dtype = np.int16))
#arange 函数生成的数组的元素按照等比数列排布,类似于range函数。
print(np.arange( 10, 30, 5 ))
print(np.arange( 0, 2, 0.3 )) # it accepts float arguments
#linspace函数有些类似matlab中的同名函数,下面是个例子:
print(np.linspace( 0, 2, 9 )) # 9 numbers from 0 to 2
x = np.linspace( 0, 2*pi, 100 ) # useful to evaluate function at lots of points
f = np.sin(x)
输出结果:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]]
[[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]
[10 15 20 25]
[0. 0.3 0.6 0.9 1.2 1.5 1.8]
[0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]
二、基础函数
2.1 算数运算
基本的算术运算符都可以应用于数组类型,结果为对应元素之间的运,返回值为一个新的数组;比如
a = np.array([20,30,40,40])
b = np.arange(4)
print(a-b)
print(b**2)
print(10*np.sin(a))
print(a<35)
输出结果:
[20 29 38 37]
[0 1 4 9]
[ 9.12945251 -9.88031624 7.4511316 7.4511316 ]
[ True True False False]
2.1.1 乘法运算符
*
表示的也是元素乘法,如果需要矩阵乘法,可以使用dot
函数或者生成一个matrix
对象;
A = np.array( [[1,1],[0,1]])
B = np.array( [[2,0],[3,4]])
print(A*B) #对应元素相乘
print(np.dot(A,B)) #矩阵乘法
输出结果:
[[2 0]
[0 4]]
[[5 4]
[3 4]]
2.1.2 不同元素类型运算
当两个不同元素类型的数组运算时,结果的元素类型为两者中更精确的那个(类型提升);
a = np.ones(3,dtype=np.int32)
b = np.linspace(0,np.pi,3)
print(b.dtype)
c = a*b
print(c)
print(c.dtype)
输出结果:
float64
[0. 1.57079633 3.14159265]
float64
2.1.3 sum、min、max
Numpy
提供了许多内置的运算方法比如:
a = np.random.a = np.random.random((2,3))
print(a)random((2,3))
print(a.sum()) #计算所有元素和
print(a.min()) #获取最小的元素
print(a.max()) #获取最大的元素
输出结果:
[[0.6028089 0.66860186 0.37737517]
[0.18416065 0.03146056 0.27444081]]
2.1388479560986995
0.03146056041598588
0.668601860383035
默认情况下, 这些方法作用于整个数组,通过指定axis
,可以使其只作用于某一个axis
;
print(a.sum(axis = 0)) #按列求和
print(a.sum(axis = 1)) #按行求和
print(a.cumsum(axis = 1)) #按行累加
输出结果:
[0.78696956 0.70006242 0.65181598]
[1.64878593 0.49006202]
[[0.6028089 1.27141076 1.64878593]
[0.18416065 0.21562121 0.49006202]]
2.1.4 sin, cos, and exp
print(np.sin(a))
print(np.cos(a))
print(np.sqrt(a))
print(np.exp(a))
print(np.add(a,b))
输出结果:
[[0.56695853 0.61988949 0.36848161]
[0.18312145 0.03145537 0.27100871]]
[[0.82374634 0.78468912 0.92963504]
[0.9830903 0.99950516 0.96257689]]
[[0.77640769 0.81768078 0.61430869]
[0.42913943 0.17737125 0.52387098]]
[[1.82724415 1.95150693 1.45845138]
[1.20220895 1.03196067 1.31579469]]
[[0.6028089 2.23939819 3.51896783]
[0.18416065 1.60225689 3.41603346]]
2.2 常用函数
2.2.1 numpy.linalg.norm(x)
顾名思义:linalg = linear + algebra
,norm
则表示范数,首先需要注意的是范数是对向量(或者矩阵)的度量,是一个标量(scalar
) :
首先help(np.linalg.norm)
查看文档
norm(x, ord=None, axis=None, keepdims=False)
x
表示要度量的向量,ord
表示范数的种类
参数 | 说明 | 计算方法 |
---|---|---|
默认 | 二范数 | np.sqrt() |
ord=2 | 二范数 | 同上 |
ord=1 | 一范数 | ||+||+...+|| |
ord=np.inf | 无穷范数 | max(||) |
用于计算向量x
的2
范数;
x = np.array([3,4])
y = np.linalg.norm(x)
print(y)
输出结果为5.0
。
计算矩阵x
的2
范数,对矩阵每一个元素求平方和然后开根号;
x = np.array([3,4,5],[3,4,5])
y = np.linalg.norm(x)
print(x)
输出结果为10.0
。
2.2.2 numpy.log10(x)
计算以10
为底的对数,log
下什么都不写默认是自然对数 e
为底;
x1 = 10
y1 = np.log10(x1)
x2 = np.e
y2 = np.log(x2)
print(y1,y2)
输出结果为1.0 1.0
。
2.2.3 numpy.nan_to_num
Replace nan with zero and inf with finite numbers
,把np.nan
(非常小的数字,接近0)用0取代。
np.inf
,或者-np.inf
(正负无穷大的数字)用有限数替代;
np.set_printoptions(precision=8)
x = np.array([np.inf, -np.inf, np.nan, -128, 128])
print(np.nan_to_num(x))
输出结果为[ 1.79769313e+308 -1.79769313e+308 0.00000000e+000 -1.28000000e+002 1.28000000e+002]
;
2.2.4 numpy.random.randn(d0, d1, …, dn)
从标准正态分布中返回一个或多个样本值。numpy.random.rand(d0, d1, …, dn)
的随机样本位于[0, 1)
中。
x1 = np.random.randn(2,4)
print(x1)
x2 = np.random.rand(2,4)
print(x2)
输出结果
[ 0.37065869 -0.04594328 0.72822393 0.74898655]]
[[ 0.54672608 0.0216933 0.04434537 0.65831692]
[ 0.06332446 0.75230353 0.12993006 0.75911764]]
2.2.5 numpy.random.normal(loc=0.0, scale=1.0, size=None)
正太分布,参数的意义为:
loc:float
:概率分布的均值,对应着整个分布的中心center
;scale:float
:概率分布的标准差,对应于分布的宽度,scale
越大越矮胖,scale
越小,越瘦高;size
:int or tuple of ints
维数;
2.2.6 numpy.random.random(size)
用于生成一个0到1的随机符点数: 0 <= n < 1.0
;例如:
print(np.random.random((2,3)))
输出结果:
[[0.5704968 0.3357748 0.14660701]
[0.96629921 0.39623942 0.2698468 ]]
2.2.7 numpy.random.uniform(a,b)
用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限;
- 如果
a > b
,则生成的随机数n: a <= n <= b
; - 如果
a <b
, 则b <= n <= a
;
测试如下:
print random.uniform(10, 20)
print random.uniform(20, 10)
# 18.7356606526
# 12.5798298022
2.2.8 random.randint(a, b)
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了