NumPy基本使用
来源:互联网 发布:淘宝上苏泊尔是正品吗 编辑:程序博客网 时间:2024/06/16 12:38
简介
一句话介绍
NumPy是高性能科学计算和数据分析的基础包。它是pandas等其他各种工具的基础。
主要功能
- ndarray,一个多维数组结构,高效且节省空间
- 无需循环对整组数据进行快速运算的数学函数
注意:数组不同与python中列表,数组中的元素类型是一致的,并且数组长度也是确定的。
安装
pip install numpy
引用方式
import numpy as np
创建ndarray对象
创建
a = np.array([1,2,3,4])
常用属性
T 数组的转置(对高维数组而言)
a = np.arange(6).reshape(2,3)"""array([[0, 1, 2], [3, 4, 5]])"""a.T"""array([[0, 3], [1, 4], [2, 5]])"""
dtype 数组元素的数据类型:
- bool_, int(8,16,32,64), uint(8,16,32,64), float(16,32,64)
- 类型转换:astype()
size 数组元素的个数
ndim 数组的维数
shape 数组的维度大小(以元组形式)
创建ndarray对象的方式
array() 将列表转换为数组,可选择显式指定dtype
arange() range的numpy版,支持浮点数(步长可以是小数)
a = np.arange(1, 10, 1.2)"""array([ 1. , 2.2, 3.4, 4.6, 5.8, 7. , 8.2, 9.4])"""# 一维转二维:reshape()方法a = np.arange(15).reshape(3,5)"""array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])"""
linspace() 类似arange(),第三个参数为数组长度(分为几份);(补充:计算机不能表示连续的的东西,比如计算机绘制函数图,其实就是打点,将一段数分为尽可能多的份数)
a = np.linspace(0, 10, 6)"""array([ 0., 2., 4., 6., 8., 10.])"""
zeros() 根据指定形状和dtype创建全0数组
a = np.zeros(10)"""step 1:假如一个数字占4个字节(32为机器),划分40字节的内存空间step 2: 对这些内存空间清零(默认是浮点型)array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"""# 创建二维数组(理解为表格)a = np.zeros((3,5), dtype='int')"""array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])"""# 创建三位数组(理解为一本表格,有3页,每页4行5列)a = np.zeros((3,4,5), dtype='int')"""array([[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]])"""
ones() 根据指定形状和dtype创建全1数组
empty() 根据指定形状和dtype创建空数组(随机值)
a = np.empty(10)"""比起zeros() 少了第二步(内存空间内还存在原来的值),因此如果创建完数组确定要重新赋值,可以选择这种方式,速度快。array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])"""
eye() 根据指定边长和dtype创建单位矩阵
tolist()
ndarray对象(数组)转列表:
索引和切片
简单计算
数组和数字(向量与标量)之间
a = np.array([1,2,3,4])b = a + 1 # array([2, 3, 4, 5])b = a * 3 # array([ 3, 6, 9, 12])b = 1 / a # array([ 1. , 0.5 , 0.33333333, 0.25 ])b = 1 // a # array([1, 0, 0, 0], dtype=int32)b = a ** 0.5 # array([ 1. , 1.41421356, 1.73205081, 2. ])
同样大小数组之间的运算
a = np.array([1,2,3,4])b = np.array([5,6,7,8])a + b # array([ 6, 8, 10, 12])a / b # array([ 0.2 , 0.33333333, 0.42857143, 0.5 ])a ** b # array([ 1, 64, 2187, 65536], dtype=int32)
数组的索引
# 一维数组,同python中的列表a = np.arange(10)a[3] # 3 ## 二维数组,用逗号,逗号左边是行,右边是列a = np.arange(10).reshape(2,5)'''array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])'''a[1,3] # 第1行第3个元素:8
数组的切片(顾头不顾尾)
# 一维切片,同python中的列表# 二维切片a = np.arange(15).reshape(3,5)"""array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])"""# 对数组a 6-8-11-13的矩形区域切片# 用逗号,逗号左边是行,右边是列:从第1行切到最后,再从第一列切到第4列(不包含)a[1:, 1:4] # """array([[ 6, 7, 8], [11, 12, 13]])"""# 切片的拷贝问题a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) b = a[0:5] # array([0, 1, 2, 3, 4]) b[1] = 666""" aarray([ 0, 666, 2, 3, 4, 5, 6, 7, 8, 9])注意:如果是python的列表,对a切片赋值给b是深拷贝,会划分新的内存空间,对b中元素的修改不影响a但是,对于ndarray对象,由于常用来处理大数据,默认执行的是浅拷贝(数据量太大,深拷贝费空间),b相当于是a的一个视图,因此对b中元素的修改,将导致对a的修改"""# 解决方案:b = a[0:5].copy() # 执行深拷贝,这样对b中元素的修改不会影响a
布尔型索引
问题1:给一个数组,选出数组中所有大于5的数。
a = np.array([1,3,8,9,11,2])a[a>5] # array([ 8, 9, 11])"""a>5会对a中的每一个元素进行判断,返回一个布尔数组布尔型索引:将同样大小的布尔数组传进索引,会返回一个由所有True对应位置的元素的数组"""
问题2:给一个数组,选出数组中所有大于5的偶数。
a = np.array([1,3,8,9,11,2])a[(a>5) & (a%2==0)] # array([8])"""注意:两个条件必须用括号括起来,因为 & 运算符的优先级高"""
问题3:给一个数组,选出数组中所有大于5的数和偶数。
a = np.array([1,3,8,9,11,2])a[(a>5) | (a%2==0)] # array([ 8, 9, 11, 2])
注意,非 的逻辑运算符是 ~
飘号
a = np.array([True, False])~a # array([False, True], dtype=bool)
花式索引
中括号中存的是用逗号分隔的下标
# 一维a = np.arange(1,10) # array([1, 2, 3, 4, 5, 6, 7, 8, 9])b = [1, 3, 6] # [] 中存的是下标a[b] # array([2, 4, 7])# 二维a =np.arange(15).reshape(3,5)"""array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])"""# 切片其中的 6 8 11 13a[1:,[1, 3]]"""array([[ 6, 8], [11, 13]])"""# 选出其第一列和第三列,组成新的二维数组。a =np.arange(15).reshape(3,5)a[:,[1,3]]"""array([[ 1, 3], [ 6, 8], [11, 13]])"""# 注意,不要在逗号的左右两边同时使用花式索引a[[1,2],[1,3]]"""array([ 6, 13])"""
通用函数
概念:能同时对数组中所有元素进行运算的函数
一元函数
abs, sqrt, exp, log, ceil, floor, rint, trunc, modf, isnan, isinf, cos, sin, tan
ceil, floor, rint, trunc 这几个函数用于浮点数转整数;trunc相当于python中的int();rint()四舍五入,相当与python中的round();
isnan, isinf,用于判断是nan 和 inf;注意, nan, inf 是浮点数的两个特殊值:
isinf表示无限大,是一个float型(5/0 除数越小,结果越大,除数趋近于零时,就是无限大。)
而nan, 表示不是一个数,甚至也不等于它本身!
a = np.array([1,2,3,4,5])b = np.array([1,1,1,1,0])c = a/b # array([ 1., 2., 3., 4., inf])np.isinf(c) # array([False, False, False, False, True], dtype=bool)c[~np.isinf(c)] # 布尔索引 array([ 1., 2., 3., 4.])float('inf') # inftype(float('inf')) # floatfloat('nan') # nantype(float('nan')) # float# nan不等于任何数float('nan') == 1.5 # Falsefloat('nan') == float('inf') # Falsefloat('nan') == float('nan') # False
二元函数
add, substract, multiply, divide, power, mod, 这些二元函数用的相对较少,因为可以直接用 符号
maximum, mininum, 比较两个数组,取其中最大/最小部分构成新的数组
a = np.array([1, 2, 3, 4, 5])b = np.array([2, 3, 4, 1, 6])np.maximum(a,b)"""array([2, 3, 4, 4, 6])"""
数学和统计方法
调用方式:np.func(obj)
或obj.func()
sum 求和
mean 求平均数
std 求标准差(方差开根号)
var 求方差(每个数减平均值再平方的结果,相加求平均
平均值一样时,方差/标准查,反映数据的离散程度
# a, b, c三个数组的平均值相同a = np.array([7,8,10,8,7])b = np.array([8,8,8,8,8])c = np.array([10,8,6,10,6])# 通过方差反映离散程度np.var(a) # 1.2np.var(b) # 0.0np.var(c) # 3.2000000000000002
均值加减 n倍的标准差,可以估计数据的范围
import randoma = np.array([random.uniform(10,20) for i in range(10)])"""array([ 14.59699686, 12.69868323, 11.06636046, 11.62997516, 14.65875624, 12.84485756, 14.87239277, 10.47546367, 12.55186776, 14.45094081])"""# 一倍a.mean() - a.std()*1 # 11.460966440505564a.mean() + a.std()*1 # 14.508292464563356# 二倍a.mean() - a.std()*2 # 9.9373034284766675a.mean() + a.std()*2 # 16.031955476592252
min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引
随机数生成
随机数函数在np.random子包中,比起Python的random模块,其可以产生二维数组
rand 给定形状产生随机数组(0到1之间的数)
randint 给定形状产生随机整数
np.random.randint(10,20,(3,5))"""array([[15, 14, 15, 16, 14], [14, 12, 10, 10, 13], [12, 12, 13, 10, 18]])"""
choice 给定形状产生随机选择
np.random.choice([1,2,3,4,5],10)"""array([4, 1, 3, 4, 2, 1, 5, 5, 3, 1])"""np.random.choice([1,2,3,4,5],(3,5))"""array([[1, 5, 3, 3, 1], [4, 3, 1, 4, 2], [3, 3, 5, 3, 3]])"""
shuffle 与random.shuffle相同
uniform 给定形状产生随机浮点数组
a = np.random.uniform(10,20,(3,5))"""array([[ 11.08600377, 10.59471275, 16.25737906, 11.0429535 , 16.12688335], [ 15.38383353, 10.8729155 , 14.77521291, 13.75258492, 14.54417658], [ 17.8514871 , 13.61437731, 16.87297584, 14.22388704, 18.50198588]])"""
- numpy基本使用
- numpy的基本使用
- NumPy基本使用
- 【Python】NumPy库基本使用
- python之numpy的基本使用
- python numpy基础(二)random基本使用
- python之numpy的基本使用
- python之numpy的基本使用
- Kaggle学习(一):numpy基本函数使用
- python numpy包的使用一 基本操作
- numpy使用
- NumPy使用
- numpy 使用
- numpy使用
- numpy基本方法总结
- numpy的基本介绍
- NumPy 基本运算
- NumPy基本方法
- POJ
- 基于MVP架构的OKHttp3的封装
- linux内存分配与回收
- 总线式布线
- 图论_模板
- NumPy基本使用
- 栈
- 线段树的简单实现和查询(修改)
- 电影《亲爱的》观后感
- #443 Div.2 B. Table Tennis 排队游戏 && 细节
- 字符串匹配的KMP算法
- selenium安装、配置及使用+java
- JS中文字前面加图标
- 2.redis常见概念