通过前面两次的学习,基本上对numpy有了一定的认识,所以,接下来进一步对numpy学习。同时,最后以一个有趣的例子加深对numpy的理解。
import numpy as np xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5]) yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5]) cond = np.array([True, False, True, True, False]) # 如果cond中的值是T时,选取xarr的值,否则从yarr中选取。这种模式就是:x if condition else y (condition与x相等,就选x,否则y) result = [(x if c else y) for x, y, c in zip(xarr, yarr, cond)] #print result ''' 上面式子可以用一个函数代替:np.where( , , ,)。第一个参数是一个判定,这个判定的结果是根据后面两个参数来输出的。其中,第二个 是第一个参数的True结果输出,而第三个参数是第一个False结果输出。 ''' result = np.where(cond,xarr,yarr) #print result from numpy.random import randn arr = randn(4,4) #把大于0的值变成2,小于0的值变成-2 result = np.where(arr > 0, 2, -2) #print result #只把大于0的值变成2,其他的不变 result = np.where(arr > 0, 2, arr) #print result ''' np.where(rond1 & rond2, 0, np.where(rond1, 1, np.where(rond2, 2, 3))) ''' ax = np.random.randn(5, 4) #print ax a = ax[0,:] #计算每一行的均值使用axis = 1 1代表行 #print ax.mean(axis=1) #print a.mean() b = ax[:,0] #计算每一列的均值使用axis = 0 0代表列 #print ax.mean(axis=0) #print b.mean() ay = np.array([[0,1,2], [3,4,5], [6,7,8]]) #计算每一列前个数与后个数的和,返回的仍是一个数组。 0代表列 #print ay.cumsum(0) #计算每一行前个数与后个数的积,返回的仍是一个数组。 1代表行 #print ay.cumprod(1) #计算ax中正数的个数, 布尔值会被强制转为1(True)和 0(False)。 #print ( ax > 0 ).sum()
import numpy as np a = np.arange(10) np.save("some_array", a) b = np.load("some_array.npy") #print b #加载txt和逗号分隔文件(CSV)方式。保存用np.savetxt方式 #ab = np.loadtxt("array_ex.txt", delimiter= ",") #线性代数 #建立一个一维数组由3个1组成。 np.ones(3) x = np.array([[1,2,3], [4,5,6]]) y = np.array([[6, 23],[-1, 7],[8, 9]]) #计算两个数组的乘积。dot()函数 x.dot(y) np.dot(x, y) np.dot(x, np.ones(3)) from numpy.random import randn from numpy.linalg import inv, qr X = randn(5, 5) mat = X.T.dot(X) #计算数组的逆 inv(mat) mat.dot(inv(mat)) #计算QR分解 q, r = qr(mat) #print r
最后,以随机漫步的例子,运用numpy加深对其的理解。
import random import numpy as np from numpy.random import randint b = np.random.randint(0,2) # numpy中的randint不能取右端的那个值,也就是例子中(0,2)不能取到2 a = random.randint(0,2) # random中的randint是可以取到右端的值,(0,2)也就是在0,1,2中随机取值 #随机漫步(普通版) position = 0 walk = [position] steps = 10 for i in xrange(steps): # 这句话实际上是一种逻辑判断句,random.randint是逻辑判断条件,与0比较。标准语句:a if condition else b .判断条件大于0,选择a,反之,选择b。 step = 1 if random.randint(0,1) else -1 position += step walk.append(position) #print walk #随机漫步(提升版) nsteps = 10 draws = np.random.randint(0,2, size= nsteps) steps = np.where(draws > 0, 1, -1) # 将结果变成一种数组 walk = steps.cumsum() #print walk #只有数组能这样使用 walk.min() walk.max() #判断从0到2步,所需要多久,多少次。 (np.abs(walk) >= 2).argmax() #多个随机漫步 nwalks = 100 nsteps = 100 draws = np.random.randint(0,2, size=(nwalks, nsteps)) steps = np.where(draws > 0, 1, -1) #计算每一行的累计和。“1”代表行,“0”代表列 walks = steps.cumsum(1) walks.min() walks.max() #计算大于20或-20的布尔值(True,False) np.abs(walks) >= 20 #计算每一行中有大于20或-20的布尔值 hits20 = (np.abs(walks) >= 20).any(1) #计算达到20或-20的行,一共有多少个 hits20.sum() #计算达到20或-20的行的漫步累计次数 walks[hits20] #计算达到20或-20的每一行第一次漫步到20或-20的步数 crossing_times = (np.abs(walks[hits20])>= 20).argmax(1) #计算达到20或-20的每一行第一次漫步到20或-20的步数的均值 print crossing_times.mean()