Numpy hello1 2 3 4 5 6 7 import numpy as npnums = np.arange(1000000 ) nums_list = list(range(1000000 )) %time for i in range(10 ): nums = nums * 2 %time for i in range(10 ): nums_list = [j * 2 for j in nums_list] print(nums)
Wall time: 20.4 ms
Wall time: 802 ms
[ 0 1024 2048 ... 1023996928 1023997952 1023998976]1 2 3 4 5 import numpy as nparr = np.array([2 , 3 , 4 , 5 , 6 ]) print(str.format("新创建的数组:{}" ,arr)) print('新的数组为:{}' .format(arr))
新创建的数组:[2 3 4 5 6]
新的数组为:[2 3 4 5 6]1 2 3 4 import numpy as nparr_two = np.array([[2 , 3 , 4 ],[5 , 6 , 7 ]]) print(str.format("新创建的数组:\n{}" ,arr_two))
新创建的数组:
[[2 3 4]
[5 6 7]]1 2 3 arr.shape arr_two.shape
(2, 3)25dtype('int32')41 2 3 4 5 import numpy as nparr1 = np.array([1 , 2.3 , 4 , 5 ], dtype = np.float64) print(arr1) arr1.dtype
[1. 2.3 4. 5. ]
dtype('float64')1 2 3 4 import numpy as nparr1 = np.array([1 , 2.3 , 4 , 5 ]) print(arr1) arr1.dtype
[1. 2.3 4. 5. ]
dtype('float64')1 2 3 4 arr2 = arr1.astype(np.float32) print(arr2) arr2.dtype
[1. 2.3 4. 5. ]
dtype('float32')1 2 3 arr2 = arr1.astype(np.float32) print(arr2) arr2.dtype
[1. 2.3 4. 5. ]
dtype('float32')10.0array([2, 3, 4, 5, 6])array([0., 0., 0., 0., 0.])array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])1 np.empty([4 ,4 ],dtype=float)
array([[6.23042070e-307, 4.67296746e-307, 1.69121096e-306,
2.33644469e-307],
[1.42418987e-306, 1.37961641e-306, 1.60220528e-306,
1.24611266e-306],
[9.34598925e-307, 1.24612081e-306, 1.11260755e-306,
1.60220393e-306],
[1.51320640e-306, 9.34609790e-307, 1.24610723e-306,
1.24610723e-306]])array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])array([[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.],
[0., 0., 0., 0., 0.]])array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])array([ 1. , 1.64285714, 2.28571429, 2.92857143, 3.57142857,
4.21428571, 4.85714286, 5.5 , 6.14285714, 6.78571429,
7.42857143, 8.07142857, 8.71428571, 9.35714286, 10. ])array([ 1. , 1.1659144 , 1.35935639, 1.58489319, 1.8478498 ,
2.15443469, 2.51188643, 2.92864456, 3.41454887, 3.98107171,
4.64158883, 5.41169527, 6.30957344, 7.35642254, 8.57695899,
10. ])随机数 代码 功能 seed 确定随机数产生的种子 permutation 返回一个序列的随机排列或返回一个随机排列的范围 shuffle(x) 对一个序列进行随机排序 random(数量) 产生一个 $[0,1)$ 之间的指定数量的随机数 rand(dim0,dim1,…) 产生均匀分布的样本值得多维数组 randint(low,[high,size]) 产生指定范围得随机数 randn(dim0,dim1…) 产生正态分布得样本值得多维数组 binomial 产生二项分布得随机数组 normal 产生正高斯分布得随机数 beta 产生beta分布的随机数 chisquare 产生卡方分布的随机数 gamma 产生gamma 分布的随机数 uniform 产生 $[0,1)$ 中的均匀分布随机数
1 2 import numpy as npnp.random.random(10 )
array([0.7267818 , 0.10901465, 0.73051153, 0.48924036, 0.73107236,
0.5650844 , 0.95197014, 0.93802582, 0.00792388, 0.70891063])array([[0.94261821, 0.31523758, 0.22103568, 0.80398749, 0.84788616],
[0.4409685 , 0.54924242, 0.65323153, 0.61074349, 0.53193418],
[0.80980246, 0.30769664, 0.6696779 , 0.04090947, 0.00829057]])1 np.random.randint(3 ,size=5 )
array([2, 1, 0, 2, 2])1 np.random.randint(3 ,8 ,size=5 )
array([6, 7, 3, 6, 4])array([[ 1.299651 , 1.48551002, 0.95884946, -1.74687166, 0.40453426],
[ 0.056111 , -1.23062304, 0.39156962, -0.11775158, -0.46568318],
[-0.98578207, -0.57099212, -0.3459372 , -0.02804961, -0.10481225]])1 2 3 4 arr6 = np.arange(10 ) print(arr6) np.random.shuffle(arr6) print(arr6)
[0 1 2 3 4 5 6 7 8 9]
[9 0 5 2 4 7 6 8 1 3]1 2 3 arr7 = np.random.choice(arr6,5 ) print(arr7)
[1 7 2 7 6]1 2 3 arr = np.arange(10 ) print("通过下标索引:%d" % arr[2 ])
通过下标索引:28array([2, 3, 4])array([0, 1, 2, 3, 4])array([2, 3, 4, 5, 6, 7, 8, 9])array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])array([0, 2, 4, 6, 8])array([3, 5, 7, 9])array([8, 6, 4])1 2 arr[0 :5 ] = 18 print(arr)
[18 18 18 18 18 5 6 7 8 9]1 2 arr[0 :2 ] = 17 , 19 print(arr)
[17 19 18 18 18 5 6 7 8 9]访问多维数组 1 2 arr = np.random.randint(0 ,10 ,(5 ,5 )) print(arr)
[[8 5 7 3 3]
[1 8 7 9 5]
[1 8 8 0 5]
[3 2 1 7 9]
[6 0 7 4 1]]1 print("获取一个元素" ,arr[1 ][2 ], arr[1 ,2 ])
获取一个元素 7 7获取一行 [1 8 7 9 5]array([5, 8, 8, 2, 0])1 print("多行切片:\n" ,arr[0 :2 ])
多行切片:
[[8 5 7 3 3]
[1 8 7 9 5]]1 print("获取某行某几列 \n" ,arr[1 :3 ,2 :4 ])
获取某行某几列
[[7 9]
[8 0]]1 2 arr1 = np.array([np.eye(3 ,3 ),np.random.randint(0 ,10 ,(3 ,3 )),np.full((3 ,3 ),1 )]) print(arr1)
[[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
[[4. 7. 0.]
[3. 3. 9.]
[7. 4. 5.]]
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]]1 print("第一行3*3数组:\n" ,arr1[1 ])
第一行3*3数组:
[[4. 7. 0.]
[3. 3. 9.]
[7. 4. 5.]]改变数组形状 1 2 3 import numpy as nparr = np.arange(16 ) print('原数组:' , arr)
原数组: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15](16,)1 2 arr.shape = (4 ,4 ) print('改变后数组:\n' ,arr)
改变后数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]1 2 3 arr = arr.reshape(2 ,8 ) print('reshape改变后的数组:\n' ,arr)
reshape改变后的数组:
[[ 0 1 2 3 4 5 6 7]
[ 8 9 10 11 12 13 14 15]]数组转置:
[[ 0 8]
[ 1 9]
[ 2 10]
[ 3 11]
[ 4 12]
[ 5 13]
[ 6 14]
[ 7 15]]1 2 3 arr = np.random.randint(0 ,10 ,(3 ,4 )) print(arr)
[[9 7 7 0]
[4 4 2 9]
[4 2 8 0]]array([9, 7, 7, 0, 4, 4, 2, 9, 4, 2, 8, 0])array([9, 7, 7, 0, 4, 4, 2, 9, 4, 2, 8, 0])array([9, 4, 4, 7, 4, 2, 7, 2, 8, 0, 9, 0])1 2 3 arr1 = np.arange(9 ).reshape(3 ,3 ) print(arr1)
[[0 1 2]
[3 4 5]
[6 7 8]]1 2 arr2 = np.eye(3 ,4 ) print(arr2)
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]]1 print('横向组合:\n' ,np.hstack((arr1,arr2)))
横向组合:
[[0. 1. 2. 1. 0. 0. 0.]
[3. 4. 5. 0. 1. 0. 0.]
[6. 7. 8. 0. 0. 1. 0.]]1 2 arr2 =arr2.reshape(4 ,3 ) print('纵向组合\n' ,np.vstack((arr1,arr2)))
纵向组合
[[0. 1. 2.]
[3. 4. 5.]
[6. 7. 8.]
[1. 0. 0.]
[0. 0. 1.]
[0. 0. 0.]
[0. 1. 0.]]1 2 arr3 = np.zeros((3 ,3 )) print(arr3)
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]1 2 print('横向组合:\n' ,np.concatenate((arr1,arr3),axis=1 )) print('纵向组合:\n' ,np.concatenate((arr1,arr3),axis=0 ))
横向组合:
[[0. 1. 2. 0. 0. 0.]
[3. 4. 5. 0. 0. 0.]
[6. 7. 8. 0. 0. 0.]]
纵向组合:
[[0. 1. 2.]
[3. 4. 5.]
[6. 7. 8.]
[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]1 2 3 4 import numpy as nparr = np.arange(16 ).reshape(4 ,4 ) print(arr)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]1 print("hsplit实现横向分割:\n" ,np.hsplit(arr,2 ))
hsplit实现横向分割:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]1 print("vsplit实现纵向分割:\n" ,np.vsplit(arr,2 ))
vsplit实现纵向分割:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]1 print("split实现横向分割:\n" ,np.split(arr,2 ,axis=0 ))
split实现横向分割:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]使用函数进行简单统计分析 直接排序 arr.sort(axis=1) 横轴排序 arr.sort(axis=0) 纵轴排序 间接排序 arr.argsort 函数返回值为重新排序值的下标
np.lexsort(a,axis= -1,kind=’quicksort’,order=None)函数
返回值是按照最后一个传入的数据排序
1 2 3 4 import numpy as nparr = np.random.randint(0 ,10 ,size=10 ) print(arr)
[2 3 7 7 2 2 7 6 6 4]1 2 arr.sort() print('排序后:' ,arr)
排序后: [2 2 2 3 4 6 6 7 7 7]1 2 arr1 = np.random.randint(0 ,10 ,(3 ,3 )) print(arr1)
[[5 2 3]
[4 9 5]
[5 6 8]]1 2 3 arr1.sort(axis=0 ) print(arr1)
[[4 2 3]
[5 6 5]
[5 9 8]]1 2 3 arr1.sort(axis=1 ) print(arr1)
[[2 3 4]
[5 5 6]
[5 8 9]]1 2 3 arr2 = np.array([10 ,5 ,4 ,8 ,7 ,9 ,6 ,1 ,4 ]) print(arr2.argsort())
[7 2 8 1 6 4 3 5 0]1 2 3 4 a = np.array([1 ,5 ,8 ,7 ,9 ]) b = np.array([5 ,4 ,9 ,3 ,1 ]) np.lexsort((b,a))
array([0, 1, 3, 2, 4], dtype=int64)去重 np.nuique 函数 找出数组中的唯一值并返回已排序的结果 重复数据 np.title(A,reps) 函数
A 指定重复数组、reps指定重复的次数
np.repeat(a,repeats,axis=None)函数
a 是需要重复的数组元素,repeat 是重复次数, axis 指定沿着哪一个轴进行重复 (0:行,1:列)
1 2 3 import numpy as nparr = np.random.randint(0 ,10 ,10 ) print(arr)
[4 5 8 6 2 3 2 9 6 1]1 print("去重的数组为:" ,np.unique(arr))
去重的数组为: [1 2 3 4 5 6 8 9]1 2 arr1 = np.arange(5 ) print(arr1)
[0 1 2 3 4]1 print("重复后的数组为:" ,np.tile(arr1,2 ))
重复后的数组为: [0 1 2 3 4 0 1 2 3 4]1 2 arr2 = np.eye(2 ,2 ) print(arr2)
[[1. 0.]
[0. 1.]]1 print('重复后的二维数组为:\n' ,np.tile(arr2,2 ))
重复后的二维数组为:
[[1. 0. 1. 0.]
[0. 1. 0. 1.]]1 print('重复后的数组为:\n' ,np.repeat(arr2,3 ))
重复后的数组为:
[1. 1. 1. 0. 0. 0. 0. 0. 0. 1. 1. 1.]1 print('重复后的数组为:\n' ,np.repeat(arr2,3 ,axis=0 ))
重复后的数组为:
[[1. 0.]
[1. 0.]
[1. 0.]
[0. 1.]
[0. 1.]
[0. 1.]]1 print('重复后的数组为:\n' ,np.repeat(arr2,3 ,axis=1 ))
重复后的数组为:
[[1. 1. 1. 0. 0. 0.]
[0. 0. 0. 1. 1. 1.]]数组集合运算 intersect1d(x,y): 返回 x 和 y 的交集,并排序 union1d(x,y): 返回 x 和 y 的并集,并排序 in1d(x,y): 返回一个 x 包含于 y 的布尔类型数组 setdiff1d(x,y): 集合的差,包含于 x 但不包含于 y setxor1d(x,y): 对称差 1 2 3 arr1 = np.random.randint(10 ,size=10 ) arr2 = np.random.randint(10 ,size= 16 ) print(arr1,arr2,sep='\n' )
[7 1 1 4 1 5 6 7 2 0]
[6 6 6 8 0 0 3 1 6 9 6 1 9 1 0 3]1 np.intersect1d(arr1,arr2)
array([0, 1, 6])array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])array([False, True, True, False, True, False, True, False, False,
True])array([2, 4, 5, 7])array([2, 3, 4, 5, 7, 8, 9])通用函数 通用函数 ufunc ufun 函数种类 1. 数组运算函数
2. 三角函数
3. 位操作函数
4. 逻辑比较运算函数
5. 浮动运算函数ufunc 函数特点 不需要对数组的每一个元素做操作,只需要对整个数组操作。对数组做重估操作时,比 math 库的函数效率高ufunc 函数运算 *四则运算:* + - * /
*比较运算:* > < == >= <= !=
*逻辑运算:* np.any 表示 or ,np.all 表示 and统计运算 方法 说明 sun 对数组全部或者狗哥轴的元素求和 横轴求和:axis = 1 ,纵轴求和 axis = 0 mean 平均数 std、var 标准差、方差 min、max 最小最大值 argmin、argmax 最小最大值的索引 cumsum 所有元素的累加和 cumprod 所有元素的累积
1 2 3 import numpy as nparr = np.array([1 ,2 ,3 ,4 ],dtype=np.float32) print('对整个数组元素做运算:' ,arr*2 ,arr/2 )
对整个数组元素做运算: [2. 4. 6. 8.] [0.5 1. 1.5 2. ]1 2 3 import numpy as nparr = np.arange(12 ).reshape((3 ,4 )) print(arr)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]663812array([ 6, 22, 38])5.5array([4., 5., 6., 7.])array([4., 5., 6., 7.])0array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66], dtype=int32)数组文本的输入输出 读写二进制文件 np.save(path,arr) 将数组的数据以u二进制的格式保存 np.load(path) 从二进制文件中读取数据到数组
np.savez(path,arr1,arr2…) 可以将多个数组保存在一个文件中
用 load 读取保存了多个数组的二进制文件得到的不是一个数组,而是<class’numpy.liv.npyio.NpzFile’>类型,第一个数组的键 arr_0 ,以此类推,也可以为每一个数组设置键,如 np.savez(path,a=arr1,b=arr2)
储存时可以省略扩展名,默认为.npy,但读取时不能省略扩展名
1 2 3 import numpy as nparr = np.random.randn(5 ,4 ) print(arr)
[[ 1.76691502 -1.08039441 -0.40350105 0.96406125]
[ 0.99493877 0.21595238 -0.88694159 -0.36932894]
[ 0.3251601 0.23230016 -0.08925341 0.96288055]
[ 2.26122012 -0.59472853 -0.47374904 -0.67382618]
[ 0.04607475 -0.96208061 0.09566655 -0.01934556]]array([[-0.5801783 , -0.26424195, 0.49042146, -0.94756709],
[-0.22791802, 0.5132944 , -0.36376411, 0.66883397],
[-0.39130117, -1.46284755, 0.58822493, -0.17776915],
[-0.72752665, 1.89162354, -0.08161553, 0.7246507 ],
[ 0.48632646, 0.13803085, -0.15184375, 1.96561678]])1 a = np.random.normal(2 , 3 , (5 ,5 ))
1.65513301653007951 2 3 4 5 6 7 8 9 10 11 12 import osimport numpy as nptry : os.mkdir("file" ) np.save("file/datas" ,arr) print("保存成功" ) except (FileExistsError): print("目录已存在!" ) except : print("保存有误!" )
目录已存在!1 2 3 new_arr = np.load("file/datas.npy" ) print("从文件读取的数组为:\n" ,new_arr)
从文件读取的数组为:
[[-1.48351205 -0.08488229 0.94531674 -0.72758347]
[ 0.3792332 1.02024961 0.39069898 0.00791982]
[-0.58633905 0.0622996 -0.62425041 -1.07766676]
[-1.96618486 -0.2602688 0.03066785 -0.55700679]
[-2.05873488 0.17521658 0.40626465 0.83277939]]1 2 3 4 5 6 7 8 arr1 = np.arange(10 ) try : np.savez("file/many_datas" ,arr,arr1) except (FileExistsError): print("目录已存在" ) except : print("保存有误" )
1 2 3 4 5 new_arr = np.load("file/many_datas.npz" ) for key in new_arr: print(new_arr[key],sep='\n' )
[[ 1.76691502 -1.08039441 -0.40350105 0.96406125]
[ 0.99493877 0.21595238 -0.88694159 -0.36932894]
[ 0.3251601 0.23230016 -0.08925341 0.96288055]
[ 2.26122012 -0.59472853 -0.47374904 -0.67382618]
[ 0.04607475 -0.96208061 0.09566655 -0.01934556]]
[0 1 2 3 4 5 6 7 8 9]读取文本文件(或csv文件) np.savetxt(path,arr,fmt=”%.18e”,delimiter=’ ‘)
np.loadtxt(path,delimiter=’, ‘)
1 2 3 import numpy as nparr = np.random.randn(5 ,4 ) print(arr)
[[ 0.51666554 0.52728543 -1.67820382 0.85743429]
[ 0.18516987 -1.53983397 -1.0383123 2.10651557]
[-0.1205388 1.75803776 -0.38514154 1.80570042]
[ 0.27818704 1.16017565 0.18467675 -0.68460184]
[-0.30606144 0.06184502 0.43185454 0.4830804 ]]1 2 3 4 5 6 7 8 9 10 import ostry : os.mkdir("file_txt" ) np.savetxt("file_txt/datas.txt" ,arr,delimiter=',' ) print("保存完成" ) except (FileExistsError): print("目录已存在" ) except : print("保存有误" )
目录已存在1 2 3 new_arr = np.loadtxt("file_txt/datas.txt" ,delimiter= ',' ) print(new_arr)
[[-0.51816154 -1.03003293 -1.46684964 0.36764561]
[-0.40502544 0.47040483 -1.19918069 0.50684394]
[ 0.37248315 0.19435167 -0.25253265 0.78144051]
[ 0.43759414 -0.17827265 -1.7950681 0.0644805 ]
[ 0.87283079 2.68541385 1.89818794 -0.45307242]]1 2 3 4 5 from time import timefrom math import exp, sqrt, logfrom random import gauss, seedz = gauss(0.0 , 1.0 ) print(z)
0.36641298441538733