NumPy是高性能科学计算和数据分析的基础包,它是pandas等其他各种工具的基础
NumPy的主要功能:
1 ndarray:一个多维数组结构,高效且节省空间 2 无需循环对整个数组进行快速运算的数学函数 3 读写磁盘的工具以及用于操作内存映射文件的工具 4 线性代数,随机数生成和傅里叶变换功能 5 用于集成c,c++等代码的工具
安装方法:
1 pip install numpy
引用方法:
1 import numpy ap np
NumPy:array-多维数组
array比python列表快,占用空间小
导入sys模块,对比list和np.array占用空间大小 a = list(range(100)) sys.getsizeof(a) 1016 b = np.array(range(100)) sys.getsizeof(b) 896
创建ndarray: np.array()
ndarray还可以是多维数组,但元素类型必须相同
为什么要使用ndarray:
例: 已知购物车中没件商品的价格和商品件数,求总金额 import random 方法一: prize = [random.uniform(10.0,20.0) for i in range(20)] # 价格 num = [random.randint(1, 10) for i in range(20)] # 数量 prize_np = np.array(prize) num_np = np.array(num) np.dot(prize_np, num_np) # dot点乘,向量 总金额:1670.34 方法二: prize_np * num_np array([153.5 , 120.32, 53.52, 62.75, 73.5 , 97. , 87.5 , 17.13, 125.02, 132.16, 144.36, 102.54, 39.36, 129.96, 15.56, 10.72, 41.44, 73.98, 61.32, 128.7 ]) _.sum() 总金额:1670.3400000000001
dnarray常用属性
T 数组的转置(对高维数组而言) dtype 数据元素的数据类型 # a = np.array([1, 2, 3,4,5]) # a.dtype #dtype('int64') size 数组元素的个数 # a = np.array([1, 2, 3,4,5]) #a.size # 5 ndim 数组的维数 # a = np.array([1, 2, 3,4,5]) #a.ndim #1 a = np.arange(15).reshape(3,5) array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) a.ndim 2 shape 数组维度大小 a = np.arange(20).reshape(4,5) array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]]) a.shape (4, 5) #4行5列
NumPy: ndarray-多维数组对象
dtype: bool_, int(8,16, 32, 64), uint(8,16, 32, 64), float(16, 32, 64) aptype(): 类型转换 a = np.array([1,2, 3]) a.dtype dtype('int64') b = a.astype(float) b.dtype dtype('float64')
创建ndarray: array(): 将列表转换为数组,可选择显示指定dtype In [114]: a = np.array([1, 2,3], dtype='float') In [115]: a Out[115]: array([1., 2., 3.]) arange() range的numpy版,支持浮点数 In [116]: np.arange(3, 10, 0.2) Out[116]: array([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]) In [117]: np.arange(3, 10, 2) Out[117]: array([3, 5, 7, 9]) linspace() 类似arange(),第三个参数为数组长度 np.linspace(0,10,15) # 线性空间,把一个数分成多少份 Out[52]: array([ 0. , 0.71428571, 1.42857143, 2.14285714, 2.85714286, 3.57142857, 4.28571429, 5. , 5.71428571, 6.42857143, 7.14285714, 7.85714286, 8.57142857, 9.28571429, 10. ]) zeros() 根据指定形状和dtype创建全0数组 In [124]: np.zeros(10,dtype='int') Out[124]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) In [125]: np.zeros(10,dtype='bool') Out[125]: array([False, False, False, False, False, False, False, False, False, False]) ones() 根据指定形状和dtype创建全1数组 In [126]: np.ones(10,dtype='int') Out[126]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) In [127]: np.ones(10,dtype='bool') Out[127]: array([ True, True, True, True, True, True, True, True, True, True]) empty() 根据指定形状和dtype创建空数组(随机值) eye() 根据指定边长和dtype创建单位矩阵
NumPy: 索引和切片
数组和标量之间的运算
a+1 a*3 1//a a**2 In [131]: a = np.array(range(1, 10)) In [132]: a Out[132]: array([1, 2, 3, 4, 5, 6, 7, 8, 9]) In [133]: a+1 Out[133]: array([ 2, 3, 4, 5, 6, 7, 8, 9, 10]) In [134]: a*3 Out[134]: array([ 3, 6, 9, 12, 15, 18, 21, 24, 27]) In [135]: a//2 Out[135]: array([0, 1, 1, 2, 2, 3, 3, 4, 4]) In [136]: 1//a Out[136]: array([1, 0, 0, 0, 0, 0, 0, 0, 0]) In [137]: a**2 Out[137]: array([ 1, 4, 9, 16, 25, 36, 49, 64, 81])
同样大小数组之间的运算
a+b a/b a**b In [144]: a = np.array(range(1, 10)) In [145]: b = np.array(range(2, 11)) In [146]: a+b Out[146]: array([ 3, 5, 7, 9, 11, 13, 15, 17, 19]) In [147]: a/b Out[147]: array([0, 0, 0, 0, 0, 0, 0, 0, 0]) In [148]: a**b Out[148]: array([ 1, 8, 81, 1024, 15625, 279936, 5764801, 134217728, 3486784401])
数组的索引
In [149]: a = np.array(range(10)) In [150]: a[5] Out[150]: 5
数组的切片
In [161]: a = np.array(range(10)) In [163]: a[1:6] Out[163]: array([1, 2, 3, 4, 5]) In [164]: a[-1] Out[164]: 9 b = a2.reshape(3,5) # 多维数组切片,左行右列 array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) In [169]: b[0:2, 2:4] # 1-2行的3-4列 Out[169]: array([[2, 3], [7, 8]]) In [170]: b[0:2, 3:5] # 1-2行的4-5列 Out[170]: array([[3, 4], [8, 9]]) In [171]: b[:, 1] #所有行的第2列 Out[171]: array([ 1, 6, 11])
与列表不同,数组切片时并不会自动复制,在切片数组上的修改会影响原数组(解决方法:copy())
c = b[:2] c[-1] = 250 In [173]: b Out[173]: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) In [178]: c = b[:2] In [179]: c Out[179]: array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) In [180]: c[-1] = 250 In [181]: c Out[181]: array([[ 0, 1, 2, 3, 4], [250, 250, 250, 250, 250]]) In [182]: b Out[182]: array([[ 0, 1, 2, 3, 4], [250, 250, 250, 250, 250], [ 10, 11, 12, 13, 14]]) 解决方法copy() In [185]: b Out[185]: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) In [188]: c = b[:2].copy() In [189]: c Out[189]: array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) In [190]: c[-1] = 250 In [191]: c Out[191]: array([[ 0, 1, 2, 3, 4], [250, 250, 250, 250, 250]]) In [192]: b Out[192]: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
NumPy:布尔型索引
需求:给一个数组,选出数组中所有小于5的数
a = [random.randint(0, 20) for i in range(20)] In [70]: a Out[70]: [20, 19, 4, 13, 6, 15, 6, 10, 12, 17, 16, 15, 19, 10, 9, 4, 3, 12, 18, 12] aa = np.array(a) In [73]: aa[aa<5] Out[73]: array([4, 4, 3])
原理: a<5会对a中的每一个元素进行判断,返回一个布尔数组 布尔型索引:将同样大小的布尔数组传进索引,会返回一个由索引有True对应位置的元素的数组
aa<5
Out[74]:
array([False, False, True, False, False, False, False, False, False,
False, False, False, False, False, False, True, True, False,
False, False])
需求二:给一个数组,选出数组中所有大于5的偶数
aa[(aa<5)&(aa%2==0)] # and Out[77]: array([4, 4])
需求三:给一个数组,选出数组中所有大于5的数和偶数
aa[(aa>5)|(aa%2==0)] # or Out[78]: array([20, 4, 6, 6, 10, 12, 16, 10, 4, 3, 12, 18, 12])
需求四:给一个数组,选出数组中不小于5的数
In [79]: aa[~(aa<5)] # not Out[79]: array([20, 19, 13, 6, 15, 6, 10, 12, 17, 16, 15, 19, 10, 9, 12, 18, 12])
花式索引
需求一:对于一个数组,选出其中第1,3,6,7,9个元素,组成一个新的二维数组 a[[1,3,6,7,9]] 需求二:对一个二维数组,选出其中第一列和第三列,组成新的二维数组 a[:, [1,3]] 或 a[:,[True, False, True, False, False]] # 取1,3列