pythonnumpy教程_Python学习教程:通俗易懂的Numpy入门教程

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

080f84f3b186dd9825cf925ffde0191b.gif

目录如何构建numpy数组

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

如何从数组提取特定的项

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

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

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

1.如何构建numpy数组

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

import numpy as np

list1 = [0,1,2,3,4]

arr1d = np.array(list1)

#打印数组和类型

print(type(arr1d))

arr1d

[0 1 2 3 4]

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

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

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

可以对数组的某一项数据都加2# Add 2 to each element of arr1d

arr1d + 2

#> array([2, 3, 4, 5, 6])

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

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

numpy可以通过列表中的列表来构建二维数组。# Create a 2d array from a list of lists

list2 = [[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 array

arr2d_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 list

arr1d_obj.tolist()

#> [1, 'a']

总结数组和列表主要的区别:数组支持向量化操作,列表不支持;

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

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

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

2.如何观察数组属性的大小和形状(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

3. 如何从数组提取特定的项

数组的索引是从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 > 4

b

#> array([[False, False, False, False],

#> [False, False, True, True],

#> [ True, True, True, True]], dtype=bool)

# 取布尔型数组保留的原始数组的值

arr2[b]

#> array([ 5., 6., 5., 6., 7., 8.])

3.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.]])

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

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

arr2[1,1] = np.nan # not a number

arr2[1,2] = np.inf # infinite

arr2

#> 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.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.])

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

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

为了让新数组与父数组相互独立,你需要使用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数组的一部分给新数组arr2b

arr2b = arr2[:2, :2].copy()

arr2b[:1, :1] = 101 # arr2没有改变

arr2

#> array([[ 100., 2., 3., 4.],

#> [ 3., -1., -1., 6.],

#> [ 5., 6., 7., 8.]])

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

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

扁平(flattening)是对多维数组转化为一维数组。# 3x4数组重构为4x3数组

arr2.reshape(4, 3)

#> array([[ 100., 2., 3.],

#> [ 4., 3., -1.],

#> [ -1., 6., 5.],

#> [ 6., 7., 8.]])

5.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的值并未影响arr2

arr2

#> 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.]])

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

np.arrange函数手动生成指定数目的序列数,与ndarray作用一样。# 默认下限为0

print(np.arange(5))

# 0 to 9,默认步数为1

print(np.arange(0, 10))

# 递增步数2

print(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和50

np.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.]])

6.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]

6.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']

6.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的基本用法不太熟悉的伙伴,重点可以看一下了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css hack技巧_5种减少Hack的编码技巧

css hack技巧在本文中,我们将探讨五种方法,这些方法可以使用有效的编码来帮助垃圾回收器花费更少的CPU时间分配和释放内存,并减少GC开销。 较长的GC通常会导致我们的代码在回收内存时停止(也称为“停止世界”)。 一些…

mysql数据库全备_MySQL innobackupex全备是指什么

MySQL innobackupex全备是指什么发布时间:2020-06-03 10:10:31来源:51CTO阅读:133作者:三月下文主要给大家带来MySQL innobackupex全备是指什么,希望这些内容能够带给大家实际用处,这也是我编辑MySQL innob…

数组初始化使用(写)new与不使用(不写)new

首先,数组初始化时,写不写new没有区别的。int arr[] new int[]{ 3, 9, 8};或者int[] arr {3,9,8};编译器遇到 int a[] {3, 8, 9}; 会编译成和 int a[] new int[] {3, 8, 9}; 完全一样的中间代码。 ①不同于String类。String由于实现了常量池&#xf…

Java数组(2)--一维数组

一、一维数组的(声明赋值)初始化 声明:type var[]; 或 type[] var;(示例:int[] age;) 初始化: ①动态初始化:声明且为数组元素分配空间,与赋值的操作分开进行 int[] ar…

Java数组(3)--二维(多维)数组

二维数组相当于一维数组的元素是一维数组 一、二维数组声明赋值初始化 动态初始化① int[][] arr new int[3][2];定义了名称为arr的二维数组 二维数组中有3个一维数组 每一个一维数组中有2个元素 一维数组的名称分别为arr[0], arr[1], arr[2] 给第一个一维数组1脚标位赋值为…

workflow java_workflow java实现的activity工作流实例 Develop 238万源代码下载- www.pudn.com...

文件名称: workflow下载收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 134 KB上传时间: 2014-09-18下载次数: 3提 供 者: 张华详细说明:java实现的activity工作流实例 -java activity文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉)…

使用OAuth 2 / OpenID Connect的SSO的Spring Boot 2本机方法

这篇文章是3篇系列文章的最后一部分,该系列文章探讨了如何为基于Spring Boot 2的应用程序启用OAuth2提供程序SSO。 3个帖子是: 引导兼容OpenID Connect的OAuth2授权服务器/ OpenID提供程序的方法 与OAuth2授权服务器/ OpenID提供程序集成的旧版Spring …

实现任意行数的杨辉三角

public class JavaTest {public static void main(String[] args) {//放置杨辉三角的数组&#xff0c;可通过更改new int[n][]中n的值以获取不同行数的杨辉三角int[][] yangItem new int[10][];//获取杨辉三角数组中每个元素的值for (int i 0;i < yangItem.length;i){//当…

java excel sheet页_Java导出Excel Sheet页

1、问题背景导出Excel表格时&#xff0c;首先要生成Sheet页&#xff0c;下面将介绍如何生成Sheet页2、实现源码/**** Project:* Title:ExcelExport.java* Package:report.utils* Description:* Author:YouHaiDong* Date:2015年11月2日 下午6:29:22* Version:*/package report.u…

鸿蒙与安卓系统简单对比,绝非追求三分天下。

鸿蒙是面向5G物联网、面向全场景的分布式操作系统&#xff0c;其不是安卓系统的分支或修改而来的&#xff0c;与安卓、iOS是不一样的操作系统。鸿蒙将打通手机、电脑、平板、电视、电器设备、工业自动化控制、无人驾驶、车机设备 、智能穿戴统一成一个操作系统&#xff0c;并且…

(0.1)鸿蒙HarmonyOS开发工具DevEco Studio设置

1、打开设置操作框 2.1主题设置&#xff08;可以工具自己的喜好设置主题&#xff09; 2.2设置字体 2.3设置注释 2.4设置提示语句忽略大小写&#xff08;输入小写时&#xff0c;提示语句也会出现大写的关键字等&#xff09; 2.5设置自动导包&#xff08;不用导包&#xff0c;工具…

向Java最佳专家的全球专家学习Java

Java with the Best Virtual Conference是您学习微服务&#xff0c;Java 9&#xff0c;Kubernetes以及其他Java的指南&#xff01; 将于4月17日至18日收听&#xff0c;收听来自Pivotal&#xff0c;RedHat&#xff0c;Microsoft&#xff0c;Oracle和Netflix等公司的行业领导者进…

(0.2)HarmonyOS鸿蒙开发工具DevEco Studio工程文件目录结构

1、基本不会去动添加修改的一些文件夹 2、主要直接使用操作的文件夹entry 3、开发操作main文件夹 也就是说&#xff0c;我们其实主要就只要用到java&#xff0c;resources两个文件夹和config.json一个文件。把代码放java文件夹里面&#xff0c;把开发用到的图片视频等资源放res…

(0.3)HarmonyOS鸿蒙开发工具DevEco Studio 模拟器使用

1、登录华为账号 2、打开模拟器 3、选择模拟器 4、将程序运行在模拟器 5、当下面的building进度条完成后

(1.1)HarmonyOS鸿蒙中Ability概念及意义

1、简单理解&#xff1a;在鸿蒙中&#xff0c;可以简单理解为&#xff0c;打开APP后一个页面为一个Ability&#xff0c;而一个页面里面又有很多子页面&#xff08;切片、片段&#xff09;为AbilitySlice。 2、意义 一个Ability对应一个Hap包&#xff0c;一个APP则是由多个Hap包…

Java实现冒泡排序动画展示

原理&#xff1a;每次比较两个相邻的元素&#xff0c;将较大&#xff08;较小&#xff09;的元素交换至右边。 思路&#xff1a;每次冒泡排序操作都会将相邻的两个元素进行比较&#xff0c;看是否满足大小关系要求&#xff0c;如果满足&#xff0c;就根据需要&#xff08;从小…

使用Zipkin和Sleuth进行SpringBoot微服务跟踪

在本文中&#xff0c;我们将了解使用Zipkin和Spring cloud sleuth框架的微服务分布式跟踪。 尽管微服务具有自身的挑战&#xff0c;但微服务是出色的架构。 复杂的微服务架构具有与其他微服务的下游和上游依存关系&#xff0c;并且一切都是相互联系的。 在大多数情况下&#x…

log4j性能 slf4j_Log4j 2:性能接近疯狂

log4j性能 slf4j最近&#xff0c;Apache社区中一位受人尊敬的成员尝试了Log4j 2并在Twitter上写道&#xff1a; TheASF &#xff03;log4j2摇摇欲坠 &#xff01; 性能接近疯狂^^ http://t.co/04K6F4Xkaa — Mark Struberg&#xff08;struberg&#xff09; 2013年5月7日 &a…

java 输入人名_Java 读取控制台输入

Java 提供了我们两种读取控制台输入的方法&#xff1a;一、传统方法public class ReadConsoleOld {public static void main(String[] args) throws IOException {BufferedReader reader new BufferedReader(new InputStreamReader(System.in));while(true){String line read…