numpy一些常用函数小结

来源:互联网 发布:阿里云主机记录 编辑:程序博客网 时间:2024/05/22 15:48

最近在学numpy,学习一门新的语言总有许多的API,而这些API又杂又容易忘记,所以我把一些常用的函数记录下来以便以后随时查阅
1.np.sqrt()函数用来给一个列表中每一个元素求根号

import numpy as npimport numpy.random as np_randomarr = np.arange(10)print arr#out:[0 1 2 3 4 5 6 7 8 9]print np.sqrt(arr)#out:[ 0.  1.   1.41421356  1.73205081  2.   2.23606798 2.44948974  2.64575131  2.82842712  3. ]

2.np.maximum(x,y)函数用来求给定的两个两个列表中的对应每个元素的最大值,并返回列表

import numpy as npimport numpy.random as np_randomx = np_random.randn(8)y = np_random.randn(8)print x,y,np.maximum(x,y)#x = [-0.4628023  -0.60578152 -0.16527033  0.99371095 -1.68726145  0.28045865 0.77197354 -0.08402748] # y = [ 0.09538315  0.26688981 -0.10223    -1.40979706  1.94563655  2.24729599 1.15956752  0.83226026]# np.maximum =  [ 0.09538315  0.26688981 -0.10223     0.99371095  1.94563655  2.24729599  1.15956752  0.83226026]

3.np.modf(x)函数返回两个列表一个是整数部分列表,一个是小数部分列表

import numpy as np import numpy.random as np_randomarr = np_random.randn(7) * 5print 'arr = ',arr,'np.modf = ',np.modf(arr)#arr =  [ 4.66513489  1.29033991  1.48894422 -3.21496179 -1.4010007  -2.25843728 -1.97491216]  np.modf =  (array([ 0.66513489,  0.29033991,  0.48894422, -0.21496179, -0.4010007 ,-0.25843728, -0.97491216]), array([ 4.,  1.,  1., -3., -1., -2., -1.]))

4.矩阵转置函数,矩阵点积,高维矩阵坐标轴转换的一些应用

#coding:utf-8#矩阵转置import numpy as npimport numpy.random as np_randomarr = np.arange(15).reshape((3,5))#print arr[[ 0  1  2  3  4] [ 5  6  7  8  9] [10 11 12 13 14]]#print arr.T[[ 0  5 10] [ 1  6 11] [ 2  7 12] [ 3  8 13] [ 4  9 14]] #矩阵点积arr = np_random.randn(6,3)print arr,np.dot(arr.T,arr)#out:[[ 1.23173257  0.80268393  1.25454263] [-0.65430351  0.99088605 -1.26507529] [ 0.14790816  0.10454909  1.25549745] [-0.25097523 -1.42844608  0.25598424] [-1.86467754 -0.46932851  2.33760553] [ 0.58934308  0.14976993  0.41664656]]  [[  5.85449118   1.67773218  -1.61887592] [  1.67773218   3.92024567  -1.51564661]#高维矩阵的坐标轴转换arr = np.arange(16).reshape((2,2,4))print arr[[[ 0  1  2  3]  [ 4  5  6  7]] [[ 8  9 10 11]  [12 13 14 15]]]print arr.transpose(1,0,2)[[[ 0  1  2  3]  [ 8  9 10 11]] [[ 4  5  6  7]  [12 13 14 15]]]print arr.swapaxes(1,2)[[[ 0  4]  [ 1  5]  [ 2  6]  [ 3  7]] [[ 8 12]  [ 9 13]  [10 14]  [11 15]]]

上面的三个函数中转置与点积应该上过高数的人都懂,关键在于坐标轴转换函数,在高维中我们称坐标轴是从第0个轴开始的因此上面的arr.transpose(1,0,2)
就表示第2个轴不懂交换第0轴和第一轴,如下所示
详细解释:
arr数组的内容为
- a[0][0] = [0, 1, 2, 3]
- a[0][1] = [4, 5, 6, 7]
- a[1][0] = [8, 9, 10, 11]
- a[1][1] = [12, 13, 14, 15]
transpose的参数为坐标,正常顺序为(0, 1, 2, … , n - 1),
现在传入的为(1, 0, 2)代表a[x][y][z] = a[y][x][z],第0个和第1个坐标互换。
- a’[0][0] = a[0][0] = [0, 1, 2, 3]
- a’[0][1] = a[1][0] = [8, 9, 10, 11]
- a’[1][0] = a[0][1] = [4, 5, 6, 7]
- a’[1][1] = a[1][1] = [12, 13, 14, 15]

arr.swapaxes(1,2)也是和上面差不多交换第一个轴和地二个轴

print arr.swapaxes(0,1)[[[ 0  1  2  3]  [ 8  9 10 11]] [[ 4  5  6  7]  [12 13 14 15]]]

可以看到和上面的print arr.transpose(1,0,2)一样的结果
5.数组对应的乘法、减法除法

import numpy as nparr = np.array([[1,2,3.0],[4.0,5,6]])print arr - arr[[ 0.  0.  0.] [ 0.  0.  0.]]print arr * arr[[  1.   4.   9.] [ 16.  25.  36.]]print 1/arr[[ 1.          0.5         0.33333333] [ 0.25        0.2         0.16666667]]print arr ** 0.5[[ 1.          1.41421356  1.73205081] [ 2.          2.23606798  2.44948974]]

6.数组类型制定参数dtype与数据类型转换函数astype

#coding:utf-8print '生成数组时指定数据类型'import numpy as nparr = np.array([1,2,3],dtype = np.float64)print arr.dtype#float64arr = np.array([1,2,3],dtype = np.int32)print arr.dtype#int32print '使用astype复制数组并转换数据类型'int_arr = np.array([1,2,3,4,5])float_arr = int_arr.astype(np.float)print int_arr.dtype#int64print float_arr.dtype#float64print '使用astype将float转换为int时小数部分被舍弃'float_arr = np.array([2.4,1.4,4.5,1.5])int_arr = float_arr.astype(dtype = np.int)print int_arr[2 1 4 1]print '使用astype把字符串转换为数组,如果失败抛出异常。'str_arr = np.array(['1.2','2.4','2.3'],dtype = np.string_)float_arr = str_arr.astype(dtype = np.float)print float_arr[ 1.2  2.4  2.3]print 'astype使用其它数组的数据类型作为参数'int_arr = np.arange(10)float_arr = np.array([1.2,2.3,5.6],dtype = np.float64)print int_arr.astype(float_arr.dtype)#[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]

7.数组索引的一些应用

#coding:utf-8import numpy as nparr = np.empty((8,4))for i in range(8):    arr[i] = i#打印第4行,第3行,第0行,第6行数据print arr[[4,3,0,6]][[ 4.  4.  4.  4.] [ 3.  3.  3.  3.] [ 0.  0.  0.  0.] [ 6.  6.  6.  6.]]arr = np.arange(32).reshape((8,4))print arr[[ 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]]#打印arr[1][0],arr[5][3],arr[7][1],arr[2,2]print arr[[1,5,7,2],[0,3,1,2]][ 4 23 29 10]#打印选定行的对应的列print arr[[1,5,7,2]][:,[0,3,1,2]][[ 4  7  5  6] [20 23 21 22] [28 31 29 30] [ 8 11  9 10]]print arr[np.ix_([1,5,7,2],[0,3,1,2])][[ 4  7  5  6] [20 23 21 22] [28 31 29 30] [ 8 11  9 10]]

8.np.zero()函数用来生成全是0的数组与np.empty()用来生成一个空的数组(虽然可能在你电脑上使用这个函数的时候有值,值可能是0或者其它,但其实它生成的数组应该是一个空的)

import numpy as npnp.zeros(10)Out[69]: array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])print np.zeros((3,6))[[ 0.  0.  0.  0.  0.  0.] [ 0.  0.  0.  0.  0.  0.] [ 0.  0.  0.  0.  0.  0.]]print np.empty((2,3,2))[[[ 4.  4.]  [ 4.  4.]  [ 3.  3.]] [[ 3.  3.]  [ 6.  6.]  [ 6.  6.]]]

9.布尔索引的一些应用

import numpy as npimport numpy.random as np_randomname_arr =np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])rand_arr = np_random.randn(7,4)print rand_arr[[-1.82397798 -0.02475999 -1.05391711 -0.09195784] [ 0.58072312 -0.60623037 -0.72832453 -0.3967706 ] [-0.98425286  0.20487701 -0.50738989 -1.18534881] [-2.04733816  0.98808353 -0.25746984 -0.08985969] [-0.11875836 -0.95636464  1.41807321  0.38314495] [-0.70933744 -0.53211986 -1.58546288  0.3870686 ] [ 0.28461165 -1.22913798  2.97719825  0.47703007]]#打印对于索引为True的值也就是第0行和第3print rand_arr[name_arr == 'Bob'][[-1.82397798 -0.02475999 -1.05391711 -0.09195784] [-2.04733816  0.98808353 -0.25746984 -0.08985969]]#打印对于的行和列print rand_arr[name_arr == 'Bob',:2][[-1.82397798 -0.02475999] [-2.04733816  0.98808353]]#打印取反的对应的行print rand_arr[~(name_arr == 'Bob')][[ 0.58072312 -0.60623037 -0.72832453 -0.3967706 ] [-0.98425286  0.20487701 -0.50738989 -1.18534881] [-0.11875836 -0.95636464  1.41807321  0.38314495] [-0.70933744 -0.53211986 -1.58546288  0.3870686 ] [ 0.28461165 -1.22913798  2.97719825  0.47703007]]mask_arr = (name_arr == 'Bob')|(name_arr == 'Will')print rand_arr[mask_arr][[-1.82397798 -0.02475999 -1.05391711 -0.09195784] [-0.98425286  0.20487701 -0.50738989 -1.18534881] [-2.04733816  0.98808353 -0.25746984 -0.08985969] [-0.11875836 -0.95636464  1.41807321  0.38314495]]rand_arr[name_arr != 'Joe'] = 7print rand_arr[[ 7.          7.          7.          7.        ] [ 0.58072312 -0.60623037 -0.72832453 -0.3967706 ] [ 7.          7.          7.          7.        ] [ 7.          7.          7.          7.        ] [ 7.          7.          7.          7.        ] [-0.70933744 -0.53211986 -1.58546288  0.3870686 ] [ 0.28461165 -1.22913798  2.97719825  0.47703007]]

10.numpy.linalg中的求逆函数inv,与qr分解

import numpy as npimport numpy.random as np_randomfrom numpy.linalg import inv,qr x = np.array([[1.0,2,3],[4,5,6]])y = np.array([[6,23],[-1,7],[8,9]])mat = x.T.dot(x)print inv(mat)x = np_random.randn(5,5)mat = x.T.dot(x)inv(mat)Out: array([[ 11.84687444, -11.56145594,  -5.65725983,  10.87964992,          7.08449774],       [-11.56145594,  12.09232574,   5.98095728, -11.39683366,         -6.70063725],       [ -5.65725983,   5.98095728,   3.23348475,  -5.8853187 ,         -3.50549578],       [ 10.87964992, -11.39683366,  -5.8853187 ,  11.21150189,          6.53822392],       [  7.08449774,  -6.70063725,  -3.50549578,   6.53822392,          4.66110929]])mat.dot(inv(mat))Out: array([[  1.00000000e+00,   3.39716498e-15,   1.49782320e-15,          1.83676775e-15,   0.00000000e+00],       [  1.42818200e-14,   1.00000000e+00,   1.23314155e-15,          3.83692157e-15,   0.00000000e+00],       [  2.32658788e-15,  -5.22866192e-16,   1.00000000e+00,         -5.09344939e-15,   0.00000000e+00],       [ -5.16927092e-15,  -1.24169261e-16,   2.70233995e-15,          1.00000000e+00,  -2.22044605e-15],       [  0.00000000e+00,  -2.13162821e-14,   3.55271368e-15,          0.00000000e+00,   1.00000000e+00]])print mat[[  7.02225343   6.26630278  -5.71904522   0.17946762  -6.2179201 ] [  6.26630278   7.57852343  -5.01182539   2.14901066  -5.41337169] [ -5.71904522  -5.01182539  11.92261964   3.39074865   5.69807664] [  0.17946762   2.14901066   3.39074865   4.12046195  -0.41319453] [ -6.2179201   -5.41337169   5.69807664  -0.41319453   6.74816678]]q,r = qr(mat)print q[[-0.55519117  0.18834857 -0.45498506  0.39651103  0.54042129] [-0.49542444 -0.57697237  0.09716331  0.3885269  -0.51113956] [ 0.45215734 -0.18772943 -0.81625432  0.15011252 -0.26740704] [-0.01418901 -0.74100777 -0.08208317 -0.44183326  0.49875031] [ 0.49159923 -0.21746917  0.33247425  0.68853137  0.35555982]]print r[[-12.64835211 -12.19141702  13.80210286   0.10724925  12.03373455] [  0.          -2.66667445  -4.17544298  -4.80609789  -0.27880506] [  0.           0.          -6.00063474  -3.11616047  -0.07049193] [  0.           0.           0.          -0.68995137   1.11552585] [  0.           0.           0.           0.           0.07628223]]

11.读取文件的函数np.loadtxt()
建立个array_ex.txt文件(默认工作目录),里面填充如下数据:
1,2,3,4
2,3,4,5
4,5,6,7
1,2,3,4
用np.loadtxt函数读取它

    arr = np.loadtxt('array_ex.txt',delimiter=',')      arr      array([[ 1.,  2.,  3.,  4.],       [ 2.,  3.,  4.,  5.],       [ 4.,  5.,  6.,  7.],       [ 1.,  2.,  3.,  4.]])

12.保存文件函数np.save()与加载函数np.load(),以及多个数组压缩存储函数np.savez()

#coding:utf-8import numpy as nparr = np.arange(10)#在当前路径将arr里面的内容写入到some_array文件中若文件不存在创建文件,存在则清空当前内容np.save('some_array',arr)print np.load('some_array.npy')#[0 1 2 3 4 5 6 7 8 9]#将多个数组压缩存储在一个文件中np.savez('array_archive.npz',a = arr,b = arr)arch = np.load('array_archive.npz')arch['b']Out[129]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

13.高维函数拉平函数np.ravel()

#coding:utf-8import numpy as nparr = np.arange(15).reshape((5,3))#无论之前是几维最后都变成一维print arr.ravel()[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]

14.np.unique()函数用来去重查找一个元素是否在另外一个元素中np.in1d()

import numpy as npnames = np.array(['Bob','Joe','Will','Bob','will','Joe','Joe'])print set(names)set(['Will', 'will', 'Bob', 'Joe'])print sorted(set(names))['Bob', 'Joe', 'Will', 'will']print np.unique(names)['Bob' 'Joe' 'Will' 'will']values = np.array([6,0,0,3,2,5,6])print np.in1d(values,[2,3,6])[ True False False  True  True False  True]

15.np.repeat()函数与np.tile()函数

import numpy as nparr = np.arange(4)print arr.repeat(3)#[0 0 0 1 1 1 2 2 2 3 3 3]print arr.repeat([2,3,4,5])#[0 0 1 1 1 2 2 2 2 3 3 3 3 3]arr = arr.reshape((2,2))print arr.repeat(2,axis = 0)[[0 1] [0 1] [2 3] [2 3]]print arr.repeat(2,axis = 1)[[0 0 1 1] [2 2 3 3]]print np.tile(arr,2)[[0 1 0 1] [2 3 2 3]]print np.tile(arr,(2,3))[[0 1 0 1 0 1] [2 3 2 3 2 3] [0 1 0 1 0 1] [2 3 2 3 2 3]]

16.np.take()函数与np.put()函数

import numpy as npimport numpy.random as np_randomarr = np.arange(10) * 100inds = [7,1,2,6]print arr[inds]#[700 100 200 600]print arr.take(inds)#[700 100 200 600]arr.put(inds,50)print arr#[  0  50  50 300 400 500  50  50 800 900]
原创粉丝点击