程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

数据处理中模块之numpy

一、numpy模块

NumpyPython科学计算的基础包,它提供不了多维数组对象,基于数组的各种派生对象(例如掩码数组和矩阵),以及用于对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。

1.1 基础介绍

Numpy的核心是ndarray对象。一方面,ndarray对象封装了可以包含相同数据类型的多维数组,另一方面,为了获得更好的性能,在ndarray上的操作都是在编译过的代码上执行的,和Python自身的序列对象相比,两者有如下区别:

  • Numpy数组的大小是固定的,Pythonlist是可以动态增长的,改变Numpy的大小会重新创建一个新的数组并把原来的删掉;
  • Numpy数组中的元素一定是同一类型的(相应地,每个元素所占的内存大小也是一样的),数组的维度被称为axes,维数称为rank
  • Numpy数组支持在大量数据上进行数学计算和其他类型的操作,通常情况下与Python自带序列相比,Numpy数组上的操作执行更高效,代码量也更少;
  • 原来越多的Python科学计算都用到了Numpy数组。虽然这些库支持Python序列类型的输入,但是内部操作还是要先将其转换为Numpy的数组类型,而且输出通常就是Numpy数组。所以,如果你想要高效地使用这些Python的科学计算包,仅仅知道Python内建的序列类型是不够的,你还需要知道如何使用Numpy数组。

1.2 重要属性

ndarray的重要属性包括:

  • ndarray.ndim:数组的维数,也称为rank
  • ndarray.shape:数组各维的大小,tuple类型;对一个nm列的矩阵来说,shape(n,m)
  • ndarray.size:元素的总数;
  • ndarray.dtype:每个元素的类型,可以是numpy.int32numpy.int16numpy.float64numpy.boolnumpy.complex128等;
  • ndarray.itemsize:数组中每一个元素分别所占空间的大小;
  • ndarray.data:指向数据内存;
1.2.1 简单示例

有许多种方法生成数组。比如,可以将Python listtuple转化为数组,转化后的数组元素的类型由原来的对象的类型来决定;

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 + algebranorm则表示范数,首先需要注意的是范数是对向量(或者矩阵)的度量,是一个标量(scalar) :

首先help(np.linalg.norm)查看文档

norm(x, ord=None, axis=None, keepdims=False)  

x表示要度量的向量,ord表示范数的种类

参数 说明 计算方法
默认 二范数 np.sqrt(x12+x22+....+xn2)
ord=2 二范数 同上
ord=1 一范数 |x1|+|x2|+...+|xn|
ord=np.inf 无穷范数 max(|xi|)

用于计算向量x2范数;

x = np.array([3,4])
y = np.linalg.norm(x)
print(y)

输出结果为5.0

计算矩阵x2范数,对矩阵每一个元素求平方和然后开根号;

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越小,越瘦高;
  • sizeint 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-30I*B1
2024-01-28*兴20
2024-02-01QYing20
2024-02-11*督6
2024-02-18一*x1
2024-02-20c*l18.88
2024-01-01*I5
2024-04-08*程150
2024-04-18*超20
2024-04-26.*V30
2024-05-08D*W5
2024-05-29*辉20
2024-05-30*雄10
2024-06-08*:10
2024-06-23小狮子666
2024-06-28*s6.66
2024-06-29*炼1
2024-06-30*!1
2024-07-08*方20
2024-07-18A*16.66
2024-07-31*北12
2024-08-13*基1
2024-08-23n*s2
2024-09-02*源50
2024-09-04*J2
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-26B*h10
2024-09-3010
2024-10-02M*i1
2024-10-14*朋10
2024-10-22*海10
2024-10-23*南10
2024-10-26*节6.66
2024-10-27*o5
2024-10-28W*F6.66
2024-10-29R*n6.66
2024-11-02*球6
2024-11-021*鑫6.66
2024-11-25*沙5
2024-11-29C*n2.88
posted @   大奥特曼打小怪兽  阅读(4502)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
如果有任何技术小问题,欢迎大家交流沟通,共同进步

公告 & 打赏

>>

欢迎打赏支持我 ^_^

最新公告

程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)。

了解更多

点击右上角即可分享
微信分享提示