Numpy教程第1部分 - 阵列简介(常用基础操作总结)
【导读】这里是numpy教程的基础部分,涵盖了使用numpy的ndarrays执行数据操作和分析的一些操作。众所周知,Numpy是Python中最基本和最强大的科学计算和数据处理软件包,下面是关于专知成员Fan在学习Numpy教程Part1的一个提炼总结。
原文参照以下链接:
https://www.machinelearningplus.com/numpy-tutorial-part1-array-python-examples/
注意:以下标红的部分是笔者学习后认为比较重要,以及常用的一些操作。
一、如何创建一个numpy数组?
1、创建numpy数组的方法有很多,其中最常用的是利用list创建数组。
import numpy as np
list1 = [0,1,2,3,4]
arr1d = np.array(list1)
2、array与list的最大区别是array是用来进行向量化操作(向量的应用特别广泛),而list不是;且array相比之下占用内存少。
3、你不可以给list中的元素全部直接加一个数,但是你可以对array进行这样的操作
list1 + 2 # error
arr1d + 2 #correct
#输出结果
> array([2, 3, 4, 5, 6])
4、一旦array创建,不可以改变大小,而list可以
5、array只能有一种数据类型,list可以有多种类型,但是我们可以例如:
arr1d_obj = np.array([1, 'a'], dtype='object')
6、将一个array变回list
arr1d_obj.tolist()
7、改变array的数据类型(将arr1d数据类型改为float)
arr1d.astype('float')
8、arr1d是一维数组,构建二维数组同样很简单,三维类似
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]])
二、array的一些固有参数?
1、array的维度
2、array每一维的情况,例如数组是3*4
3、数组的数据类型
4、数组的索引
# shape
print('Shape: ', arr2d.shape)
# dtype
print('Datatype: ', arr2d.dtype)
# size
print('Size: ', arr2d.size)
# ndim
print('Num Dimensions: ', arr2d.ndim)
三、如何从数组中提取特定元素?
1、例如提取前2行和列
arr2d[:2, :2]
2、numpy array支持bool型的索引,例如下面找出arr2d中大于4的情况:
b = arr2d > 4
b
#结果
> array([[False, False, False, False],
> [False, False, True, True],
> [ True, True, True, True]], dtype=bool)
在此情况下,我们通过下面操作可以找出大于4的元素:
arr2d[b]
四、如何变化数组的行与列?
1、反转行(反转列类似),即最后一行变为第一行,其他也类推:
arr2d[::-1, ]
2、转置
arr2d[::-1,::-1 ]
五、如何表示数组中消失或无穷大的元素?
1、可以用nan表示消失的元素,inf表示无穷大的元素。(处理数据时,可能发现数据为Nan的情况)
例如插入nan与inf
arr2d[1,1] = np.nan # not a number
arr2d[1,2] = np.inf
2、判断nan和inf,所对应的索引,然后改为-1:
missing_bool = np.isnan(arr2d) | np.isinf(arr2d)
arr2d[missing_bool] = -1
六、如何计算均值、最大值、最小值?
1、
print("Mean value is: ", arr2d.mean())
print("Max value is: ", arr2d.max())
print("Min value is: ", arr2d.min())
2、计算每一行/每一列的最小值(最大值、均值类似):
print("Column wise minimum: ", np.amin(arr2, axis=0))#列
print("Row wise minimum: ", np.amin(arr2, axis=1))#行
七、如何利用一个已有的数组创建一个新的数组?
1、
arr2a = arr2d[:2,:2]
arr2a[:1, :1] = 100
注意这里会改变arr2d中的元素,上述过程并没有真正创建一个数组
2、
arr2b = arr2d[:2, :2].copy()
arr2b[:1, :1] = 101
(对于数据的拷贝和更改要十分注意)
注意这里不会改变arr2d,是一种复制
八、Reshaping 和 Flattening一个数组
1、reshape可以改为其他形式的数组,flatten改为一维数组
arr2d.reshape(4, 3)
九、flatten()与ravel()的区别?
ravel后改变元素会改变原始数组的值,而flatten不会改变
十、产生数组元素
1、线性切分:
np.linspace(start=1, stop=50, num=10, dtype=int)#1-50,划分十个数
2、对数切分:(注意起始与中止的数是要以幂次的形式,这里底为10,次方分别为1和50)
np.logspace(start=1, stop=50, num=10, base=10) #10^1-10^50划分十个数
3、创建2*2的全0和全1数组:
np.zeros([2,2])
np.ones([2,2])
4、
np.arange(0, 10, 2)#0-10以2为间隔划分
十一、如何重复序列
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]
十二、如何产生随机数
1、
print(np.random.randint(0, 10, size=[2,2]))#产生元素为0-10的2*2数组
2、
print(np.random.choice(['a', 'e', 'i', 'o', 'u'], size=10, p=[0.3, .1, 0.1, 0.4, 0.1]))
#在字符中,随机产生十次字符,每次产生时,按照给定可能性产生
3、给一个随机种子:
np.random.seed(100)
# Create random numbers between [0,1) of shape 2,2
print(np.random.rand(2, 2))
# > [[ 0.54 0.28]
# > [ 0.42 0.84]]
十三、如何知道数组中所含有的元素以及每个元素所对应的个数?(用于统计数组中的数据以及数据个数)
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]
# Get the unique items and their counts
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教程的基础部分,后续会介绍Numpy教程的提升部分,将详细说明Numpy用于数据分析所体现的功能。我们都知道python以其强大的数据处理能力著称,而numpy则是python数据处理最重要的包之一。在这里编者圈出了原文(part1部分)关于特殊形式array的构造、array中特定元素的提取、以及array中的数据统计情况。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 网络请求框架OkHttp3全解系列 - (二)OkHttp的工作流程分析
- 这次,我把Android事件分发机制翻了个遍
- 网络请求框架OkHttp3全解系列 - (三)拦截器详解1:重试重定向、桥、缓存(重点)
- Python全栈(七)Flask框架之4.Flask模板继承与案例练习
- 你想要的系列:网络请求框架OkHttp3全解系列 - (四)拦截器详解2:连接、请求服务(重点)
- 不会玩阴阳师的我带你一键下载《阴阳师:百闻牌》所有卡牌并调用百度OCR识别文字信息
- 微信小程序生命周期学习笔记-页面篇
- Python 字典 使用技巧
- 微信小程序生命周期学习笔记-组件
- C语言入门系列之2.数据类型、运算符和表达式
- 树莓派的cpu与gpu通信设计浅析
- Python全栈(七)Flask框架之5.视图高级--类视图和蓝图
- Python全栈(六)项目前导之5.使用GitHub进行多人协同开发
- 附002.Nginx代理相关模块解析
- ApiBoot v2.3.x分支第一个版本发布,重构源码架构设计