1.两种方法创建二维数组 :
[ 10 11 12
20 21 22
30 31 32 ]
代码:
#!/usr/bin/python
import numpy as np
import matplotlib as mlp
import matplotlib.pyplot as plt
if __name__ == '__main__':
a = np.array([[10,11,12],[20,21,22],[30,31,32]])
b = np.arange(10,40,10).reshape(-1,1)+np.arange(0,3,1)
print a
print b
解释:其中 a,b分别代表了一种方法,a直接输出其中的元素,b为一个横向量与一个列向量相加。
numpy中的array要比python原有的list()性能更好,且list中的元素不能为浮点型,只能为int型。
2.创造一个横向量[2,3,4,5,6],改变其维度为2行3列,查看向量的类型,查看向量中元素的类型,并且改变元素的类型。
代码:
#!/usr/bin/python
import numpy as np
import matplotlib as mlt
import matplotlib.pyplot as plt
if __name__ == '__main__':
a = np.arange(1,7,1)
b = a.reshape(2,3)
print a, type(a), a.dtype
print b, type(b), b.dtype
print b.astype(np.float).dtype
解释:np.arange(1,7,1)为步长为1,从1到7生成6个数,即左闭右开,步长为1从1到7生成一个数列。reshape(2,3)重新设定数组的维度。type()为查看变量的类型。dtype为数组中元素的类型。astype为重新设定数组中元素的类型。
3.创建复数数组。
代码:
#!/usr/bin/python
import numpy as np
import matplotlib as mlt
import matplotlib.pyplot as plt
if __name__ == '__main__':
a = np.array([[0+0j], [1+1j], [2+2j], [3+3j]])
print a, type(a), a.dtype
解释:创建复数数组,注意0j不能写成0*j。
4.对 2中的数组进行切片,且将其赋予另一个变量,并对其进行改变元素的操作。
代码:
#!/usr/bin/python
import numpy as np
import matplotlib as mlt
import matplotlib.pyplot as plt
if __name__ == '__main__':
a = np.arange(1,7,1)
print a
b = a[2:5]
c = a[::-1]
b[0] = 100
print a
print b
print c
解释:a[2:5]为对数组a进行切片操作,取其中的2,3,4位(不包括5)的元素。改变b[0]的元素,发现a[2]的值也变为 100,因为a,b共享元素。a[::-1]为从后向前输出a数组。
5.在4中,采用两种方法当改变b值时,a不变。
方法一,代码:
#!/usr/bin/python
import numpy as np
import matplotlib as mlt
import matplotlib.pyplot as plt
if __name__ == '__main__':
a = np.arange(1,7,1)
print a
b = a[2:5].copy()
b[0] = 100
print a
print b
解释:使用深度复制copy()。
方法2,代码:
#!/usr/bin/python
import numpy as np
import matplotlib as mlt
import matplotlib.pyplot as plt
if __name__ == '__main__':
a = np.arange(1,7,1)
ind = np.linspace(2,5,4)
ind = np.astype(np.int)
#ind = np.arange(2,6,1)
b = a[ind]
b[0] = 100
print a
print b
解释:当输入序列号即index值时,a与b不共享空间。
6.numpy中和原始python一些方法速度的比较。
代码:
#!/usr/bin/python
import numpy as np
import matplotlib as mlt
import matplotlib.pyplot as plt
import time
import math
if __name__ == '__main__':
for nums in np.logspace(0,7,8,base=10):
xx = np.linspace(0,10, nums)
timeStart = time.clock()
np.sin(xx)
timeEndFirst = time.clock() - timeStart
xx = xx.tolist()
timeStart = time.clock()
for ind, text in enumerate(xx):
xx[ind] = math.sin(text)
timeEndSecond = time.clock() - timeStart
print nums, ': ', timeEndFirst, timeEndSecond, timeEndFirst/timeEndSecond
解释:np.logspace(0,7,8,base =10)为以base=10为底,生成8个指数,幂分别为从0到7的8个数。np.linspace(0,10,nums)为从0, 到10 把这个区间分为nums份。logspace与linspace是闭区间,即0,到10都能取到,而arange为左闭右开,右边的值取不到。
7.生成20个随机数范围为0~1不包括1,包括0。找出其中大与0.6的数。
代码(生成随机数):
#!/usr/bin/python
import numpy as np
import matplotlib as mlt
import matplotlib.pyplot as plt
if __name__ == '__main__':
np.random.seed(0)
a = np.random.rand(20)
print a
解释: seed()中为种子,当seed()中有数时,产生的随机数不变。没数时一直是变的。
代码(找到大于0.6的数):
#!bin/usr/python
import numpy as np
import matplotlib as mlt
import matplotlib.pyplot as plt
if __name__ == '__main__':
np.random.seed()
a = np.random.rand(20)
print a
b = a > 0.6
print b, type(b)
print a[b]
解释:b为一个布尔型的数组,可以当成数组的索引。
8.两种方法对二维数组去重。
[1 2]
3 4
5 6
1 3
3 4
7 6]
即去除重复的[1 3]。
方法1(使用复数的索引),代码:
#!/usr/bin/python
import numpy as np
import matplotlib as mlt
import matplotlib.pyplot as plt
if __name__ == '__main__':
a = np.array([[1,2],[3,4],[5,6],[1,3],[3,4],[7,6]])
print a
b = a[:,0].reshape(-1,1)
c = a[:,1].reshape(-1,1)
d = b + c*1j
ind = np.unique(d, return_index = True)[1]
a = a[ind]
print b
print c
print d
print a
解释:由原始二维数组的第一列与第二列构建一个复数数组,找到复数数组重复的元素。注意c*1j不能写成c*j。
方法2,使用set()与tuple()。set无重复元素,tuple不能改变,且其是hashble的,因此可以当set中的元素。代码:
#!/usr/bin/python
import numpy as np
import matplotlib as plt
if __name__ == '__main__':
a = np.array([[1,2],[3,4],[5,6],[1,3],[3,4],[7,6]])
print a
#d = list()
#for ii in list(set(tuple(t) for t in a)):
# d.append(list(ii))
# print d
b = np.array(list(set(tuple(t) for t in a)))
print b
解释:可以选择对一个数组增加set中的元素值来去重。注意,不能直接写b = np.array(list(set(t for t in a)))
因为t为unhashble。注释掉的部分为将tuple转化为list元素的操作。
9.画一个正太高斯分布。
代码:
#!/usr/bin/python
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import math
if __name__ == '__main__':
mu = 0
sigma = 1
x = np.arange(-3,3,0.1)
y = np.exp(-(x-mu)**2/(2*sigma**2))/math.sqrt(2*math.pi)*sigma
plt.plot(x, y, 'r-', linewidth=2, label='Gaussian')
plt.legend(loc = 'upper right')
plt.xlabel('x', fontsize = 15)
plt.ylabel('y', fontsize = 15)
plt.grid(True)
plt.show()
不解释