返回顶部
首页 > 资讯 > 后端开发 > Python >如何进行Python Numpy的入门
  • 258
分享到

如何进行Python Numpy的入门

2023-06-02 03:06:56 258人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

如何进行python Numpy的入门,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Numpy是Python语言中最基础和最强大的科学计算和数据处理的工具包,如数据分析工具pa

如何进行python Numpy的入门,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Numpy是Python语言中最基础和最强大的科学计算和数据处理的工具包,如数据分析工具pandas也是基于numpy构建的,机器学习包scikit-learn也大量使用了numpy方法。本文介绍了Numpy的n维数组在数据处理和分析的所有核心应用。

如何构建numpy数组

构建numpy数组的方法很多,比较常用的方法是用np.array函数对列表进行转化。

# 通过列表创建一维数组import numpy as nplist1 = [0,1,2,3,4]arr1d = np.array(list1)#打印数组和类型print(type(arr1d))arr1d<type 'numpy.ndarray'>[0 1 2 3 4]

数组和列表最关键的区别是:数组是基于向量化操作的,列表不是,我们在实际项目中处理的数据一般是矩阵结构,对该数据以行向量或列向量的形式进行计算,向量计算是基于数组实现的,因此数组比列表的应用更广。

函数可以应用到数组的每一项,列表不行。

比如,不可以对列表的每一项数据都加2,这是错误的。

list1 + 2 # 错误

可以对数组的某一项数据都加2

# Add 2 to each element of arr1darr1d + 2#> array([2, 3, 4, 5, 6])

另一个区别是已经定义的numpy数组不可以增加数组大小,只能通过定义另一个数组来实现,但是列表可以增加大小。

然而,Numpy有更多的优势,让我们一起来发现。

numpy可以通过列表中的列表来构建二维数组。

# Create a 2d array from a list of listslist2 = [[0,1,2], [3,4,5], [6,7,8]]arr2d = np.array(list2)arr2d#> array([[0, 1, 2],#> [3, 4, 5],#> [6, 7, 8]])

你也可以通过dtype参数指定数组的类型,一些最常用的numpy类型是:'float','int','bool','str'和'object'。

# Create a float 2d arrayarr2d_f = np.array(list2, dtype='float')arr2d_f#> array([[ 0., 1., 2.],#> [ 3., 4., 5.],#> [ 6., 7., 8.]])

输出结果的小数点表示float类型,你也可以通过 astype方法转换成不同的类型。

# 转换成‘int’类型arr2d_f.astype('int')#> array([[0, 1, 2],#> [3, 4, 5],#> [6, 7, 8]])# 先转换‘int’类型,再转换‘str’类型arr2d_f.astype('int').astype('str')#> array([['0', '1', '2'],#> ['3', '4', '5'],#> ['6', '7', '8']],#> dtype='U21')

另一个区别是数组要求所有项是同一个类型,list没有这个限制。如果你想要一个数组包含不同类型,设置‘dtype’为'object'。

# 构建布尔类型数组arr2d_b = np.array([1, 0, 10], dtype='bool')arr2d_b#> array([ True, False, True], dtype=bool)# 构建包含数值和字符串的数组arr1d_obj = np.array([1, 'a'], dtype='object')arr1d_obj#> array([1, 'a'], dtype=object)

最终使用 tolist()函数使数组转化为列表。

# Convert an array back to a listarr1d_obj.tolist()#> [1, 'a']

总结数组和列表主要的区别:

  • 数组支持向量化操作,列表不支持;

  • 数组不能改变长度,列表可以;

  • 数组的每一项都是同一类型,list可以有多种类型;

  • 同样长度的数组所占的空间小于列表;

如何观察数组属性的大小和形状(shape)

一维数组由列表构建,二维数组arr2d由列表的列表构建,二维数组有行和列,比如矩阵,三维数组由嵌入了两个列表的列表构建。

假设给定一个数组,我们怎么去了解该数组的属性。

数组的属性包括:

  • 数组的维度(ndim)

  • 数组的形状(shape)

  • 数组的类型(dtype)

  • 数组的大小(size)

数组元素的表示(通过索引

# 定义3行4列的二维数组list2 = [[1, 2, 3, 4],[3, 4, 5, 6], [5, 6, 7, 8]]arr2 = np.array(list2, dtype='float')arr2#> array([[ 1., 2., 3., 4.],#> [ 3., 4., 5., 6.],#> [ 5., 6., 7., 8.]])# 形状(shape)print('Shape: ', arr2.shape)# 数组类型(dtype)print('Datatype: ', arr2.dtype)# 数组大小(size)print('Size: ', arr2.size)# 数组维度(ndim)print('Num Dimensions: ', arr2.ndim)# 取数组第3行3列元素print('items of 3 line 3 column: ', c[2,2])#> Shape: (3, 4)#> Datatype: float64#> Size: 12#> Num Dimensions: 2#> items of 3 line 3 column: 7

如何从数组提取特定的项

数组的索引是从0开始计数的,与list类似。numpy数组通过方括号的参数以选择特定的元素。

# 选择矩阵的前两行两列arr2[:2, :2]list2[:2, :2] # 错误#> array([[ 1., 2.],#> [ 3., 4.]])

numpy数组支持布尔类型的索引,布尔型索引数组与过滤前(array-to-be-filtered)的数组大小相等,布尔型数组只包含Ture和False变量,Ture变量对应的数组索引位置保留了过滤前的值 。

arr2#> array([[ 1., 2., 3., 4.],#> [ 3., 4., 5., 6.],#> [ 5., 6., 7., 8.]])# 对数组每一个元素是否满足某一条件,然后获得布尔类型的输出b = arr2 > 4b#> array([[False, False, False, False],#> [False, False, True, True],#> [ True, True, True, True]], dtype=bool)# 取布尔型数组保留的原始数组的值arr2[b]#> array([ 5., 6., 5., 6., 7., 8.])

1 如何反转数组

# 反转数组的行arr2[::-1, ]#> array([[ 5., 6., 7., 8.],#> [ 3., 4., 5., 6.],#> [ 1., 2., 3., 4.]])# Reverse the row and column positions# 反转数组的行和列arr2[::-1, ::-1]#> array([[ 8., 7., 6., 5.],#> [ 6., 5., 4., 3.],#> [ 4., 3., 2., 1.]])

2 如何处理数组的缺失值(missing)和无穷大(infinite)值

缺失值可以用np.nan对象表示,np.inf表示无穷大值,下面用二维数组举例:

# 插入nan变量和inf变量arr2[1,1] = np.nan # not a numberarr2[1,2] = np.inf # infinitearr2#> array([[ 1., 2., 3., 4.],#> [ 3., nan, inf, 6.],#> [ 5., 6., 7., 8.]])# 用-1代替nan值和inf值missing_bool = np.isnan(arr2) | np.isinf(arr2)arr2[missing_bool] = -1 arr2#> array([[ 1., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])

3 如何计算n维数组的平均值,最小值和最大值

# 平均值,最大值,最小值print("Mean value is: ", arr2.mean())print("Max value is: ", arr2.max())print("Min value is: ", arr2.min())#> Mean value is: 3.58333333333#> Max value is: 8.0#> Min value is: -1.0

如果要求数组的行或列的最小值,使用np.amin函数

# Row wise and column wise min# 求数组行和列的最小值# axis=0表示列,1表示行print("Column wise minimum: ", np.amin(arr2, axis=0))print("Row wise minimum: ", np.amin(arr2, axis=1))#> Column wise minimum: [ 1. -1. -1. 4.]#> Row wise minimum: [ 1. -1. 5.]

对数组的每个元素进行累加,得到一维数组,一维数组的大小与二维数组相同。

# 累加np.cumsum(arr2)#> array([ 1., 3., 6., 10., 13., 12., 11., 17., 22., 28., 35., 43.])

如何从现有的数组定义新数组

如果使用赋值运算符从父数组定义新数组,新数组与父数组共占同一个内存空间,如果改变新数组的值,那么父数组也相应的改变。

为了让新数组与父数组相互独立,你需要使用copy()函数。所有父数组都使用copy()方法构建新数组。

# Assign portion of arr2 to arr2a. Doesn't really create a new array.# 分配arr2数组给新数组arr2a,下面方法并没有定新数组arr2a = arr2[:2,:2] arr2a[:1, :1] = 100 # arr2相应位置也改变了arr2#> array([[ 100., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])# 赋值arr2数组的一部分给新数组arr2barr2b = arr2[:2, :2].copy()arr2b[:1, :1] = 101 # arr2没有改变arr2#> array([[ 100., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])

多维数组的重构(reshaping)和扁平(flattening)

重构(reshaping)是改变了数组项的排列,即改变了数组的形状,未改变数组的维数。

扁平(flattening)是对多维数组转化为一维数组。

# 3x4数组重构为4x3数组arr2.reshape(4, 3)#> array([[ 100., 2., 3.],#> [ 4., 3., -1.],#> [ -1., 6., 5.],#> [ 6., 7., 8.]])

1 flatten()和ravel()的区别

数组的扁平化有两种常用的方法,flatten()和ravel() 。flatten处理后的数组是父数组的引用,因此新数组的任何变化也会改变父数组,因其未用复制的方式构建数组,内存使用效率高,ravel通过复制的方式构建新数组。

# flatten方法arr2.flatten()#> array([ 100., 2., 3., 4., 3., -1., -1., 6., 5., 6., 7., 8.])# flatten方法b1 = arr2.flatten() b1[0] = 100 # 改变b1的值并未影响arr2arr2#> array([[ 100., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])# ravel方法b2 = arr2.ravel() b2[0] = 101 # 改变b2值,相应的改变了arr2值arr2#> array([[ 101., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])

如何通过numpy生成序列数(sequences),重复数(repetitions)和随机数(random)

np.arrange函数手动生成指定数目的序列数,与ndarray作用一样。

# 默认下限为0print(np.arange(5)) # 0 to 9,默认步数为1print(np.arange(0, 10)) # 递增步数2print(np.arange(0, 10, 2)) # 降序print(np.arange(10, 0, -1))#> [0 1 2 3 4]#> [0 1 2 3 4 5 6 7 8 9]#> [0 2 4 6 8]#> [10 9 8 7 6 5 4 3 2 1]

上例是通过np.arrange设置初始位置和结束位置来生成序列数,如果我们设置数组的元素个数,那么可以自动计算数组的递增值。

如构建1到50的数组,数组有10个元素,使用np.linspace总动计算数组的递增值。

# 起始位置和结束位置分别为1和50np.linspace(start=1, stop=50, num=10, dtype=int)#> array([ 1, 6, 11, 17, 22, 28, 33, 39, 44, 50])

我们注意到上面例子的递增值并不相等,有5和6两个值,原因是计算递增值采用了四舍五入的算法(rounding)。与np.linspace类似,np.logspace以对数尺度的方式增长。

# 设置数组的精度为小数点后两位np.set_printoptions(precision=2) # 起点为 10^1 and 终点为 10^50,数组元素个数10,以10为底数np.logspace(start=1, stop=50, num=10, base=10) #> array([ 1.00e+01, 2.78e+06, 7.74e+11, 2.15e+17, 5.99e+22,#> 1.67e+28, 4.64e+33, 1.29e+39, 3.59e+44, 1.00e+50])

初始化数组的元素全为1或全为0。

np.zeros([2,2])#> array([[ 0., 0.],#> [ 0., 0.]])np.ones([2,2])#> array([[ 1., 1.],#> [ 1., 1.]])

1如何构建重复的序列数

np.tile重复整个的数组或列表n次,np.repeat重复数组每一项n次。a = [1,2,3] # 重复数组a两次print('Tile: ', np.tile(a, 2))# 重复数组a每项两次print('Repeat: ', np.repeat(a, 2))#> Tile: [1 2 3 1 2 3]#> Repeat: [1 1 2 2 3 3]

2 如何生存随机数

random模块包含的函数可以生成任一数组形状的随机数和统计分布。

# 生成2行2列的[0,1)的随机数print(np.random.rand(2,2))# 生成均值为0方差为1的2行2列的正态分布值print(np.random.randn(2,2))# 生成[0,10)的2行2列的随机整数print(np.random.randint(0, 10, size=[2,2]))# 生成一个[0,1)的随机数print(np.random.random())# 生成[0,1)的2行2列的随机数print(np.random.random(size=[2,2]))# 从给定的列表等概率抽样10次print(np.random.choice(['a', 'e', 'i', 'o', 'u'], size=10)) # 从给定的列表和对应的概率分布抽样10次print(np.random.choice(['a', 'e', 'i', 'o', 'u'], size=10, p=[0.3, .1, 0.1, 0.4, 0.1])) # picks more o's#> [[ 0.84 0.7 ]#> [ 0.52 0.8 ]]#> [[-0.06 -1.55]#> [ 0.47 -0.04]]#> [[4 0]#> [8 7]]#> 0.08737272424956832#> [[ 0.45 0.78]#> [ 0.03 0.74]]#> ['i' 'a' 'e' 'e' 'a' 'u' 'o' 'e' 'i' 'u']#> ['o' 'a' 'e' 'a' 'a' 'o' 'o' 'o' 'a' 'o']

3 如何得到数组独特(unique)的项和个数(counts)

np.unique函数去除数组中重复的元素,设置return_counts参数为True,得到数组每一项的个数。

# 定义范围为[0,10),个数为10的随机整数数组np.random.seed(100)arr_rand = np.random.randint(0, 10, size=10)print(arr_rand)#> [8 8 3 7 7 0 4 2 5 2]# 得到数组独特的项和相应的个数uniqs, counts = np.unique(arr_rand, return_counts=True)print("Unique items : ", uniqs)print("Counts : ", counts)#> Unique items : [0 2 3 4 5 7 8]#> Counts : [1 2 1 1 1 2 2]

对numpy的基本用法不太熟悉的伙伴,重点可以看一下了!

看完上述内容,你们掌握如何进行Python Numpy的入门的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网Python频道,感谢各位的阅读!

--结束END--

本文标题: 如何进行Python Numpy的入门

本文链接: https://www.lsjlt.com/news/228693.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何进行Python Numpy的入门
    如何进行Python Numpy的入门,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包,如数据分析工具pa...
    99+
    2023-06-02
  • 如何进行python快速入门
    这期内容当中小编将会给大家带来有关如何进行python快速入门,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。九九乘法表for i in range(1,10): &...
    99+
    2023-06-25
  • 如何进行CPack的入门
    本篇文章给大家分享的是有关如何进行CPack的入门,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。背景CPack 是 CMake 2.4.2 之...
    99+
    2024-04-02
  • 如何进行jQuery UI的入门
    如何进行jQuery UI的入门,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。jQuery ui 是基于 jquery  基础类...
    99+
    2024-04-02
  • 如何进行linux SELinux入门
    小编今天带大家了解如何进行linux  SELinux入门,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“如何进行linux...
    99+
    2023-06-28
  • 如何进行DOM模型的入门
    如何进行DOM模型的入门,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。向大家描述一下DOM模型的概念,DOM是DocumentObject...
    99+
    2024-04-02
  • 如何进行SQLite快速入门
    这篇文章给大家介绍如何进行SQLite快速入门,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。SQLite基础什么是SQLiteSQLite是一款轻型的嵌入式数据库它占用资源非常的低,在...
    99+
    2024-04-02
  • 如何进行vue组件入门
    本篇文章给大家分享的是有关如何进行vue组件入门,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。初识组件应用实例化多个vue对象用new创建多个vue对象并命名,可以通过变量相互...
    99+
    2023-06-22
  • 怎么进行Python Flask入门
    这篇文章将为大家详细讲解有关怎么进行Python Flask入门,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。追溯到最初,Flask 诞生于 Armin Ronacher 在 2010 年愚...
    99+
    2023-06-25
  • 如何进行web.py数据库入门
    如何进行web.py数据库入门,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。web.py是一个非常精巧的web框架,不过其自带的db模块也...
    99+
    2024-04-02
  • 如何进行Promise对象的基础入门
    如何进行Promise对象的基础入门,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。今天来学习下Promise吧!其实这在笔试上...
    99+
    2024-04-02
  • 怎么进行Python的加密库入门
    这期内容当中小编将会给大家带来有关怎么进行Python的加密库入门,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。加密你的数据并使确保安全。密码学俱乐部的一条规则是:永远不要自己发明密码系统。密码学俱乐部的...
    99+
    2023-06-16
  • Python入门教程(三十九)Python的NumPy安装与入门
    目录安装 NumPy导入 NumPyNumPy as np检查 NumPy 版本安装 NumPy 如果你已经在系统上安装了 Python 和 PIP,那么安装 NumPy 非常容易。...
    99+
    2023-05-12
    Python NumPy安装 Python NumPy入门
  • 如何进行ActiveMQ的简单入门与使用
    这期内容当中小编将会给大家带来有关如何进行ActiveMQ的简单入门与使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、什么是消息中间件消息中间件顾名思义实现的就是在两个系统或两个客户端之间进行消息传...
    99+
    2023-06-21
  • 怎么进行DOM入门
    怎么进行DOM入门,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。这里向大家简单介绍一下DOM的概念,当浏览器支持JavaScr...
    99+
    2024-04-02
  • 如何进行Python数据分析?正确的“入门之路”三部曲!
    Python是一种面向对象、直译式计算机程序设计语言,由于他简单、易学、免费开源、可移植性、可扩展性等特点,Python又被称之为胶水语言。下图为主要程序语言近年来的流行趋势,Python受欢迎程度扶摇直上。由于Python拥有非常丰富的库...
    99+
    2023-06-05
  • Java中如何进行TCP和套接字入门
    今天就跟大家聊聊有关Java中如何进行TCP和套接字入门,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JDK 提供了对 TCP(Transmission Control Protoc...
    99+
    2023-06-17
  • 怎么进行Objective-C的入门
    怎么进行Objective-C的入门,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言Objective-C(下面简称OC)是由C语言和Smalltalk扩展出...
    99+
    2023-06-21
  • python扩展库numpy入门教程
    目录一、numpy是什么?二、numpy数组2.1 数组使用2.2 创建数组1. 使用empty创建空数组2. 使用arange函数创建3. 使用zeros函数生成数组4. ones...
    99+
    2024-04-02
  • 如何对Json入门文档进行详细分析
    本篇文章给大家分享的是有关如何对Json入门文档进行详细分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Json入门文档,作为一种数据操纵语...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作