18px;"
2.>>>> Z = np.random.random((3,3))
3.>>> print Z
4.[[ 0.95171484 0.61394126 0.38864802]
5. [ 0.41943918 0.9398714 0.31608202]
6. [ 0.9993507 0.91717093 0.73002723]]
random.uniform(a,b),用于生成1个指定范围内的随机浮点数,两个参数其中一个是上限,一个是下限。
如果a>b,则生成的随机数n:
a<=n<=b。
如果a
random.randint(a,b),用于生成1个指定范围内的整数。
其中参数a是下限,参数b是上限,生成的随机数n:
a<=n<=b
random.randrange([start],stop[,step]),从指定范围内,按指定基数递增的集合中获取一个随机数。
如:
random.randrange(10,100,2),结果相当于从[10,12,14,16,...96,98]序列中获取一个随机数。
random.randrange(10,100,2)在结果上与random.choice(range(10,100,2)等效。
random.choice从序列中获取一个随机元素。
其函数原型为:
random.choice(sequence)。
参数sequence表示一个有序类型。
这里要说明一下:
sequence在python不是一种特定的类型,而是泛指一系列的类型。
list,tuple,字符串都属于sequence。
有关sequence可以查看python手册数据模型这一章。
下面是使用choice的一些例子:
printrandom.choice("学习Python")
printrandom.choice(["JGood","is","a","handsome","boy"])
printrandom.choice(("Tuple","List","Dict"))
二、入门级10道
1、创建一个8*8的“棋盘”矩阵。
[python] viewplaincopy
1.18px;">>>> z=np.zeros((8,8),dtype=int)
2.>>> z[1:
:
2,:
:
2]=1 %1、3、5、7行&&0、2、4、6列的元素置为1
3.>>> print z
4.[[0 0 0 0 0 0 0 0]
5. [1 0 1 0 1 0 1 0]
6. [0 0 0 0 0 0 0 0]
7. [1 0 1 0 1 0 1 0]
8. [0 0 0 0 0 0 0 0]
9. [1 0 1 0 1 0 1 0]
10. [0 0 0 0 0 0 0 0]
11. [1 0 1 0 1 0 1 0]]
12.>>> z[:
:
2,1:
:
2]=1
13.>>> print z
14.[[0 1 0 1 0 1 0 1]
15. [1 0 1 0 1 0 1 0]
16. [0 1 0 1 0 1 0 1]
17. [1 0 1 0 1 0 1 0]
18. [0 1 0 1 0 1 0 1]
19. [1 0 1 0 1 0 1 0]
20. [0 1 0 1 0 1 0 1]
21. [1 0 1 0 1 0 1 0]]
2、min()、max()函数
[python] viewplaincopy
1.18px;">>>> z=np.random.random((10,10))
2.>>> zmin,zmax=z.min(),z.max()
3.>>> print zmin,zmax
4.0.014230501632 0.99548760299
3、函数tile(A,reps),reps即重复的次数,不仅可以是数字,还可以是array。
比如构造棋盘矩阵:
[python] viewplaincopy
1.18px;">>>> z=np.tile(np.array([[0,1],[0,1]]),(4,4))
2.>>> print z
3.[[0 1 0 1 0 1 0 1]
4. [0 1 0 1 0 1 0 1]
5. [0 1 0 1 0 1 0 1]
6. [0 1 0 1 0 1 0 1]
7. [0 1 0 1 0 1 0 1]
8. [0 1 0 1 0 1 0 1]
9. [0 1 0 1 0 1 0 1]
10. [0 1 0 1 0 1 0 1]]
4、归一化,将矩阵规格化到0~1,即最小的变成0,最大的变成1,最小与最大之间的等比缩放。
[python] viewplaincopy
1.18px;">>>> Z = np.random.random((5,5))
2.>>> Zmax,Zmin = Z.max(), Z.min()
3.>>> Z = (Z - Zmin)/(Zmax - Zmin)
4.>>> print Z
5.[[ 0. 0.32173291 0.17607851 0.6270374
6.
7.0.95000808]
8. [ 0.49153473 0.70465605 0.61930085 0.00303294 1.
9.
10.]
11. [ 0.4680561 0.88742782 0.29899683 0.80704789
12.
13.0.12300414]
14. [ 0.05094248 0.23065875 0.82776775 0.07873239
15.
16.0.50644422]
17. [ 0.27417053 0.78679222 0.517819 0.5649124 0.4716856
18.
19.]]
5、矩阵点乘
[python] viewplaincopy
1.18px;">>>> z=np.dot(np.ones((5,3)),np.ones((3,2)))
2.>>> print z
3.[[ 3. 3.]
4. [ 3. 3.]
5. [ 3. 3.]
6. [ 3. 3.]
7. [ 3. 3.]]
6、矩阵相加,5*5矩阵+1*5的向量,相当于每一行都加上1*5矩阵
[python] viewplaincopy
1.18px;">>>> Z = np.zeros((5,5))
2.>>> Z += np.arange(5)
3.>>> print Z
4.[[ 0. 1. 2. 3. 4.]
5. [ 0. 1. 2. 3. 4.]
6. [ 0. 1. 2. 3. 4.]
7. [ 0. 1. 2. 3. 4.]
8. [ 0. 1. 2. 3. 4.]]
7、linspace函数,在给定区间中生成均匀分布的给定个数。
函数原型linspace(start,stop,num=50,endpoint=True, retstep=False)
[python] viewplaincopy
1.18px;">>>> Z = np.linspace(0,10,11,endpoint=True, retstep=False)
2.>>> print Z
3.[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
生成0~10之间均匀分布的11个数,包括0和1。
若endpoint=False,则10不包括在里面。
若retstep=False,会同时返回均匀区间中每两个数的间隔。
8、sort函数。
调用random模块中的random函数生成10个随机数,然后sort排序。
[python] viewplaincopy
1.18px;">>>> Z = np.random.random(10)
2.>>> Z.sort()
3.>>> print Z
4.[ 0.15978787 0.28050494 0.35865916 0.40047826 0.45141311
5.
6.0.4828367
7. 0.66133575 0.66775779 0.69278544 0.98095989]
9、allclose函数,判断两个array在误差范围内是否相等
函数原型allclose(a,b,rtol=1e-05,atol=1e-08),若absolute(a- b)<=(atol+rtol*absolute(b))则相等。
[python] viewplaincopy
1.18px;">A = np.random.randint(0,2,5)
2.B = np.random.randint(0,2,5)
3.equal = np.allclose(A,B)
4.print equal
10、mean函数,求平均值
[python] viewplaincopy
1.18px;">>>> Z = np.random.random(30)
2.>>> m = Z.mean()
3.>>> print m
4.0.362299527973
5.
6.>>> A = np.random.randint(0,2,5)
7.>>> B = np.random.randint(0,2,5)
8.>>> equal = np.allclose(A,B)
9.>>> print equal
10.False
11.
注:
randint(min,max,num)生成大小为num的array,数值范围min~max
【NumPy基础】100道numpy练习——进阶篇
NumPy只是一个数值计算的工具包,在实际的算法实现中来熟悉NumPy才是有效的,因此后面不打算继续写了,到此文为止,基本的语法已经够用了,之后在实践中总结可能效果更好。
而且遇到问题参考NumPy官网文档即可。
1、读入文件中的数据,例如一个example.txt,里面的数据如下:
[python] viewplaincopy
1.1,2,3,4
2.5,,,6
3.7,8,,9
读入该文件的代码:
[python] viewplaincopy
1.>>> Z = np.genfromtxt("example.txt", delimiter=",")
2.>>> print Z
3.[[ 1. 2. 3. 4.]
4.[ 5. nan nan 6.]
5.[ 7. 8. nan 9.]]
note:
np.genfromtxt()函数第一个参数表示文件路径名,delimiter是分隔符,在我们的exampl.txt中分隔符是逗号“,”,故设置为逗号。
顺便提一下,很多数据文件都是以csv后缀格式给出的,csv就是逗号分隔符文件。
2、numpy的高级特性:
生成器。
利用生成器函数创建数组。
[python] viewplaincopy
1.>>> def generate():
2.... for x in xrange(10):
3.... yield x
4....
5.>>> Z = np.fromiter(generate(),dtype=float,count=-1)
6.>>> print Z
7.[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
note:
其中的yield关键字使得generate()变成生成器,这是numpy的高级特性。
3、bincount()函数,输出数组中每个数出现的次数。
output的下标代表原数组中的数,output的值就是该数出现的次数,举例:
[python] viewplaincopy
1.>>> Z=[0,2,4,8,8]
2.>>> np.bincount(Z)
3.array([1, 0, 1, 0, 1, 0, 0, 0, 2])
可以看到8出现了两次。
4、bincount(x,weights=None,minlength=None),其中weights表示权重,用法如下:
[python] viewplaincopy
1.>>> X = [1,2,3,4,5,6]
2.>>> I = [1,3,9,3,4,1]
3.>>> F = np.bincount(I,X)
4.>>> print F
5.[ 0. 7. 0. 6. 5. 0. 0. 0. 0. 3.]
note:
以I为输入,X是权重。
分析一下:
F[0]=0,因为I中没有出现过0,F[1]=7,因为I中1出现了两次,并且它们的权重为1、6,故F[1]=1*1+1*6
5、Consideringa(w,h,3)imageof(dtype=ubyte),computethe numberofuniquecolors
[python] viewplaincopy
1.# Author:
Nadav Horesh
2.w,h = 16,16
3.I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte)
4.F = I[...,0]*256*256 + I[...,1]*256 +I[...,2]
5.n = len(np.unique(F))
6.print np.unique(I)
6、一个四维的数组,以后两维度为单位,计算它们的和,比如一个1*2*3*4的数组,则以后面3*4维度为单位,输出1*2的sum,举例:
[python] viewplaincopy
1.>>> A = np.random.randint(0,10,(1,2,3,4))
2.>>> print A
3.[[[[2 7 9 7]
4.[6 6 8 2]
5.[0 0 9 3]]
6.[[5 4 1 4]
7.[5 7 9 7]
8.[8 4 1 4]]]]
9.>>> A.reshape(A.shape[:
-2] + (-1,))
10.array([[[2, 7, 9, 7, 6, 6, 8, 2, 0, 0, 9, 3],
11.[5, 4, 1, 4, 5, 7, 9, 7, 8, 4, 1, 4]]])
12.>>> sum = A.reshape(A.shape[:
-2] + (-1,)).sum(axis=-1)
13.>>> print sum
14.[[59 59]]
7、Consideringaone-dimensionalvectorD,howtocompute meansofsubsetsofDusingavectorSofsamesize describingsubsetindices?
[python] viewplaincopy
1.>>> D = np.random.uniform(0,1,100)
2.>>> S = np.random.randint(0,10,100)
3.>>> D_sums = np.bincount(S, weights=D)
4.>>> D_counts = np.bincount(S)
5.>>> print D_sums
6.[ 3.37619132 6.13452126 3.84121952 5.27577033 4.45979323
7.7.26807049
8.6.00231146 6.72050881 4.1281527 6.55666661]
9.>>> print D_counts
10.[ 6 12 10 8 7 13 13 12 7 12]
11.>>> D_means = D_sums / D_counts
12.>>> print D_means
13.[ 0.56269855 0.5112101 0.38412195 0.65947129 0.63711332
14.0.55908235
15.0.46171627 0.5600424 0.5897361 0.54638888]
8、在数组[1,2,3,4,