简介
一句话介绍
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
""" a
array([ 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 13
a[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') # inf
type(float('inf')) # float
float('nan') # nan
type(float('nan')) # float
# nan不等于任何数
float('nan') == 1.5 # False
float('nan') == float('inf') # False
float('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.2
np.var(b) # 0.0
np.var(c) # 3.2000000000000002
均值加减 n倍的标准差,可以估计数据的范围
import random
a = 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.460966440505564
a.mean() + a.std()*1 # 14.508292464563356
# 二倍
a.mean() - a.std()*2 # 9.9373034284766675
a.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]])
"""