- Numpy是高性能科学计算和数据分析的基础包。它是Pandas等其他各种工具的基础。
- Numpy的主要功能:
- ndarray,一个多维数组结构,高效且节省空间
- 无需循环对整租数据进行快速运算的数学函数
- 线性代数、随机数生成和傅里叶变换功能
- 安装方法:pip install numpy
- 引用方式:import numpy as np
import numpy as np
1 为什么用numpy?
- 已知若干家跨国公式市值,要转换成人民币。
- 已知购物车中没见商品的价格与商品件数,求总金额。
import random
a = [random.uniform(100.0, 200.0) for i in range(50)] #假设已知50家公司市值
x = 6.8 #1美元=6.8元人民币
# 转换成人民币,列表——循环
b = []
for each in a:
b.append(each*x)
# 转换成人民币,数组——“*”
a = np.array(a)
a*x
array([ 971.54836946, 1230.25801894, 1009.93695086, 778.07069875,
1347.34192239, 830.85694411, 992.91816716, 968.82463502,
790.61843367, 750.04659306, 995.04823811, 940.83119352,
872.12366111, 1126.5645099 , 1015.98732282, 1286.79370318,
948.98123827, 1101.00354637, 749.46386142, 1343.44109031,
1183.17936556, 1235.68030649, 981.63529056, 1231.32330003,
963.56396015, 923.67919752, 1053.00562042, 1341.81973736,
1155.96713625, 873.60675873, 939.44328417, 700.71536278,
1123.45339544, 938.23929525, 971.43311266, 1207.33747815,
1318.36436382, 1159.48810275, 959.64425333, 733.97983522,
765.57555447, 826.24023719, 1254.31439198, 1050.46916221,
1103.59573233, 707.05767038, 698.0050053 , 1068.71018975,
1261.34352252, 832.40313494])
a = [random.uniform(10.0,20.0) for i in range(50)]
b = [random.randint(1,10) for i in range(50)]
a = np.array(a) #s转换成数组
b = np.array(b)
(a * b).sum()# a×b并求和
3676.0083431293015
2 Numpy基础
2.1 创建ndarray:np.arrray(array_like)
- 数组与列表的区别:
- 数组对象内的元素类型必须相同
- 数组大小不可改变
np.array([1,2,3,4,5])
array([1, 2, 3, 4, 5])
a = np.array(range(10))
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.array(range(10), dtype='float')
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
2.2 ndarray-数据类型
- 布尔型:bool_
- 整型:int_ int8 int16 int32 int54
- 无符号整数:uint8 uint16 uint32 uint54
- 浮点型:float_ float16 float32 float64
- 复数型:complex_ complex64 complex128
a = np.array(range(10))
a.dtype# 返回数据类型
dtype('int32')
2.3 ndarray-常用属性
- T 数组的转置(一维数组不能转置)
- size 数组元素的个数
- ndim 数组的维数
- shape 数组的维度大小(返回元组形式)
- dtype 数组元素的数据类型
a.size# 返回元素个数
10
a = np.array([[1,2,3],[4,5,6]])
a
array([[1, 2, 3],
[4, 5, 6]])
a.size
6
a.shape
(2, 3)
a = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
a.shape
(2, 2, 3)
a = np.array([[1,2,3],[4,5,6]])
a.T
array([[1, 4],
[2, 5],
[3, 6]])
_.T
array([[1, 2, 3],
[4, 5, 6]])
a = np.array(range(10))
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a.T
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
2.4 ndarray的其他创建方式
- array():将列表转换为数组,可选择显式制定dtype
- arange():是range的numpy版,支持浮点数
- linspace():类似arange(),第三个参数为数组长度
- zeros():指定形状和dtype创建全0数组
- ones():指定形状和dtype创建全1数组
- empty():指定形状和dtype创建全空数组(随机值)
- eye():根据指定边长和dtype创建单位矩阵
# 创建10个全是0的数组
np.array([0]*10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.zeros(10) # 返回浮点数
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
a = np.zeros(10)
a.dtype
dtype('float64')
np.zeros(10, dtype='int')# 增加数据类型参数,创建整数型数组
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
a = np.ones(10)
a
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
a = np.empty(100)#创建一个随机的数组。
a
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., 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.])
注:创建数组是先在内存里面申请一定数量的位置,然后把值改成相应的数据,而np.empty()只有第一个步骤。
np.arange(100)#与range()功能类似
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
np.arange(2,10)
array([2, 3, 4, 5, 6, 7, 8, 9])
np.arange(2,10,3)
array([2, 5, 8])
np.arange(2,10,0.3)#np.arange()的步长可以是小数,但是range()的步长只能是整数
array([2. , 2.3, 2.6, 2.9, 3.2, 3.5, 3.8, 4.1, 4.4, 4.7, 5. , 5.3, 5.6,
5.9, 6.2, 6.5, 6.8, 7.1, 7.4, 7.7, 8. , 8.3, 8.6, 8.9, 9.2, 9.5,
9.8])
np.linspace(0,100,100)#第3个参数是分成多少份
array([ 0. , 1.01010101, 2.02020202, 3.03030303,
4.04040404, 5.05050505, 6.06060606, 7.07070707,
8.08080808, 9.09090909, 10.1010101 , 11.11111111,
12.12121212, 13.13131313, 14.14141414, 15.15151515,
16.16161616, 17.17171717, 18.18181818, 19.19191919,
20.2020202 , 21.21212121, 22.22222222, 23.23232323,
24.24242424, 25.25252525, 26.26262626, 27.27272727,
28.28282828, 29.29292929, 30.3030303 , 31.31313131,
32.32323232, 33.33333333, 34.34343434, 35.35353535,
36.36363636, 37.37373737, 38.38383838, 39.39393939,
40.4040404 , 41.41414141, 42.42424242, 43.43434343,
44.44444444, 45.45454545, 46.46464646, 47.47474747,
48.48484848, 49.49494949, 50.50505051, 51.51515152,
52.52525253, 53.53535354, 54.54545455, 55.55555556,
56.56565657, 57.57575758, 58.58585859, 59.5959596 ,
60.60606061, 61.61616162, 62.62626263, 63.63636364,
64.64646465, 65.65656566, 66.66666667, 67.67676768,
68.68686869, 69.6969697 , 70.70707071, 71.71717172,
72.72727273, 73.73737374, 74.74747475, 75.75757576,
76.76767677, 77.77777778, 78.78787879, 79.7979798 ,
80.80808081, 81.81818182, 82.82828283, 83.83838384,
84.84848485, 85.85858586, 86.86868687, 87.87878788,
88.88888889, 89.8989899 , 90.90909091, 91.91919192,
92.92929293, 93.93939394, 94.94949495, 95.95959596,
96.96969697, 97.97979798, 98.98989899, 100. ])
np.linspace(0,100,101)
# linspace()是前后都包括了
# 分成了101份(包括0)
# 常用于画函数图像
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21.,
22., 23., 24., 25., 26., 27., 28., 29., 30., 31., 32.,
33., 34., 35., 36., 37., 38., 39., 40., 41., 42., 43.,
44., 45., 46., 47., 48., 49., 50., 51., 52., 53., 54.,
55., 56., 57., 58., 59., 60., 61., 62., 63., 64., 65.,
66., 67., 68., 69., 70., 71., 72., 73., 74., 75., 76.,
77., 78., 79., 80., 81., 82., 83., 84., 85., 86., 87.,
88., 89., 90., 91., 92., 93., 94., 95., 96., 97., 98.,
99., 100.])
import matplotlib.pyplot as plt
x = np.linspace(-10,10,10000)
y = x**2
plt.plot(x,y)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2JftPwsv-1612016077555)(output_41_0.png)]
np.eye(10)# 生成单位矩阵
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])
2.5 ndarray-批量运算
- 数组和标量之间的运算
- a+1
- a*3
- 1//a
- a**5
- a>5
- 同样大小数组之间的运算
- a+b
- a/b
- a**b
- a%b
- a==b
a = np.arange(10)
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a + 1
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
a * 3
array([ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27])
3 / a
c:\users\ibm\appdata\local\programs\python\python37\lib\site-packages\ipykernel_launcher.py:1: RuntimeWarning: divide by zero encountered in true_divide
"""Entry point for launching an IPython kernel.
array([ inf, 3. , 1.5 , 1. , 0.75 ,
0.6 , 0.5 , 0.42857143, 0.375 , 0.33333333])
b = np.arange(10,20)
b
array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
a + b
array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28])
a * b
array([ 0, 11, 24, 39, 56, 75, 96, 119, 144, 171])
a > b
array([False, False, False, False, False, False, False, False, False,
False])
a[0] = 10
a > b
array([False, False, False, False, False, False, False, False, False,
False])
2.6 ndarray-索引
# 一维数组索引
a = np.arange(10)
a[0]
0
# 二位数组索引
a = np.arange(15).reshape((3,5))
a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
a[0][0]
0
a[0,0]
0
a[2,2]
12
2.7 ndarray-切片
# 一维数组切片
a = np.arange(15)
a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
a[:4]
array([0, 1, 2, 3])
a[4:]
array([ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
b = list(range(15))
b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
c = a[:4] #相当于引用,做了一个视图
c
array([0, 1, 2, 3])
d = b[:4] #创建一个新的
d
[0, 1, 2, 3]
c[0] = 20
d[0] = 20
a
array([20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
# 如果想要创建一个新的数组,使用copy()函数。
a = np.arange(10)
e = a[:4].copy()
e[0] = 20
e
array([20, 1, 2, 3])
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 二维数组切片
a = np.arange(15).reshape((3,5))
a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
a[0:2, 0:2]
array([[0, 1],
[5, 6]])
a[::2,1::2]
array([[ 1, 3],
[11, 13]])
2.8 ndarray-布尔型索引
a = [random.randint(0, 10) for i in range(20)]
a
[9, 8, 2, 1, 4, 4, 0, 10, 6, 6, 3, 9, 3, 4, 4, 9, 2, 0, 1, 1]
# 找出一个数组中所有大于5的数
list(filter(lambda x : x > 5, a))
[9, 8, 10, 6, 6, 9, 9]
a = np.array(a)
a[a > 5]
array([ 9, 8, 10, 6, 6, 9, 9])
# 找出一个数组中所有大于5的偶数
a[(a > 5) & (a % 2 == 0)]
array([ 8, 10, 6, 6])
2.9 ndarray-花式索引
a = np.arange(20)
a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
a[[1,3,5,7]]
array([1, 3, 5, 7])
a = np.arange(20).reshape((4,5))
a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
a[0, 2:4]
array([2, 3])
a[0, a[0]>2]
array([3, 4])
a[[1,3],[1,3]]# 取的是[1,1]和[3,3]位置上的值
array([ 6, 18])
a[1::2,1::2]
array([[ 6, 8],
[16, 18]])
a[[1,3],:][:,[1,3]]
array([[ 6, 8],
[16, 18]])
2.10 Numpy-通用函数
- 通用函数:能同时对数组中所有元素进行运算的函数
- 常见通用函数:
- 一元函数:abs,sqrt, exp, log, ceil, floor, rint, trunc, modf, isnan, isinf, cos, sin, tan
- 二元函数:add, substract, multiply, divide, power, mod, maximun, minimun
a = np.arange(-5, 5)
np.abs(a)
array([5, 4, 3, 2, 1, 0, 1, 2, 3, 4])
a = np.arange(10)
np.sqrt(a)
array([0. , 1. , 1.41421356, 1.73205081, 2. ,
2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])
a = 1.6
int(a)#向0取整
1
round(a)#向0四舍五入
2
a = -1.6
int(a)
-1
round(a)
-2
import math
math.floor(a)#向下取整
-2
math.ceil(a)# 向上取整
-1
a = np.arange(-5.5, 5.5)
a
array([-5.5, -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5])
np.floor(a)
array([-6., -5., -4., -3., -2., -1., 0., 1., 2., 3., 4.])
np.ceil(a)
array([-5., -4., -3., -2., -1., -0., 1., 2., 3., 4., 5.])
np.round(a)
array([-6., -4., -4., -2., -2., -0., 0., 2., 2., 4., 4.])
np.trunc(a)#相当于单个数值时的int()
array([-5., -4., -3., -2., -1., -0., 0., 1., 2., 3., 4.])
np.rint(a)# 相当于np.round()
array([-6., -4., -4., -2., -2., -0., 0., 2., 2., 4., 4.])
np.modf(a)#把整数部分和小数部分分开
(array([-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5]),
array([-5., -4., -3., -2., -1., -0., 0., 1., 2., 3., 4.]))
浮点数特殊值
- nan(Not a number):不等于任何浮点数(nan!=nan)
- inf(infinity):比任何浮点数都大
- Numpy中创建特殊值:np.nan,np.inf
- 在数据分析中,nan常被用做表示数据缺失值
float('nan')#把字符串nan转换成浮点数不会报错
nan
a = np.nan
a
nan
a != np.nan
True
a = np.arange(5)
b = a/a
b
c:\users\ibm\appdata\local\programs\python\python37\lib\site-packages\ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in true_divide
array([nan, 1., 1., 1., 1.])
np.nan in b
False
np.isnan(b)
array([ True, False, False, False, False])
b[~(np.isnan(b))]
array([1., 1., 1., 1.])
2.11 Numpy数学和统计方法
- sum 求和
- mean 求平均数
- min 求最小值
- max 求最大值
- std 求标准差
- var 求方差
- argmin求最小值索引
- argmax求最大值索引
a = np.array([3,4,5,6,7])
a
array([3, 4, 5, 6, 7])
a.sum()
25
a.mean()
5.0
a = np.arange(0,10,0.2)
a
array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4,
2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8, 5. ,
5.2, 5.4, 5.6, 5.8, 6. , 6.2, 6.4, 6.6, 6.8, 7. , 7.2, 7.4, 7.6,
7.8, 8. , 8.2, 8.4, 8.6, 8.8, 9. , 9.2, 9.4, 9.6, 9.8])
a.mean()+a.std()
7.786173937932363
a.mean()-a.std()
2.0138260620676376
a.argmax()
49
a.argmin()
0
生成随机数
- 随机函数在np.random子包内
- rand给定形状产生随机数组(0到1之间的数)
- randint给定形状生成随机整数
- choice给定形状产生随机选择
- shuffle与random模块里面的shuffle()功能一样
- uniform给定形状产生随机数组
import random
random.random()#返回0~1之间的浮点数
0.33974840838056275
random.randint(0,10)
1
random.choice([1,3,4,5])
3
random.shuffle(a)# 改变的是原列表中元素的位置
a
[4, 3, 1, 2]
np.random.randint(0,10)
3
np.random.randint(0,10,10)
array([0, 9, 2, 5, 7, 8, 7, 5, 0, 9])
np.random.randint(0,10,(3,5))
array([[0, 5, 4, 3, 9],
[9, 7, 7, 7, 3],
[9, 1, 2, 4, 8]])
np.random.rand(10)
array([0.87378977, 0.33263006, 0.16150175, 0.64087174, 0.84878454,
0.55151132, 0.13053042, 0.10932033, 0.73284465, 0.78065613])
np.random.rand(15).reshape((3,5))
array([[0.03878439, 0.98258217, 0.79012658, 0.25156537, 0.14919864],
[0.83778259, 0.58277696, 0.19777845, 0.88624567, 0.52116526],
[0.26123987, 0.549867 , 0.15060013, 0.19665386, 0.56762764]])
np.random.choice([1,2,3,4,5])
4
np.random.choice([1,2,3,4,5],10)
array([1, 2, 1, 2, 2, 3, 2, 4, 1, 3])
a = [1,2,3,4]
np.random.shuffle(a)# 改变的是原数组中元素的位置
a
[1, 2, 4, 3]
random.uniform(2.0,4.0)
2.766299467157591
np.random.uniform(2.0,4.0,10)
array([2.24885655, 2.96570215, 3.42231782, 2.32249887, 3.29880152,
3.38426602, 2.22924905, 2.20250663, 3.53510689, 2.40333176])