|
- 基于Wes McKinney的Python for Data Analysis第四章NumPy Basics: Arrays and Vectorized Computation整理代码得来。
最近在自学Python,感觉还是要敲一下的,又懒得在书上做笔记,所以在Notebook上写写喽。
有需要的尽管参考~谢谢
- #通过np.array()用list创建一维数组
- #list是用[]括起来的,元素之间用逗号
- data1 = [6,7.5,8,0,1]
- arr1 = np.array(data1)
- print arr1
- type(data1)
复制代码 [ 6. 7.5 8. 0. 1. ]
list
- #通过np.array()用list创建二维数组
- #list是用[]括起来的,每行是一个[],不同行之间用逗号
- data2 = [[1,2,3,4],[5,6,7,8]]
- arr2 = np.array(data2)
- print arr2
复制代码 [[1 2 3 4] [5 6 7 8]]- #查看数组的位数和形状以及数据类型
- print arr2.shape
- print arr2.ndim
- print arr1.dtype
- print arr2.dtype
复制代码 (2, 4)
2float64int64
#可以通过制定dtype来强制显性规定数组内元素的数据类型 #可以用过np.asdtype来转换ndarray里面的元素的数据类型,如果非数字类型的list强制转化会报错
- """
- 2
- 通过numpy的函数来新建数组
- 3
- """
- 4
-
- 5
- print '全是0的五位数组:',np.zeros(5)
- 6
- print '全是1的五维数组:',np.ones(5)
- 7
- print '全是0的3*3数组:',np.zeros((3,3))
- 8
- print '全是1的3*3数组:',np.ones((3,3))
- 9
- print '全是1的3*3*3数组:',np.ones((2,2,2))
- 10
- print np.empty((3,3))
- 11
- print np.ones_like(arr2)#生成一个维度如同括号内数组的全是0的数组,传入的参数为ndarry格式
- 12
- print np.zeros_like(arr2)
- 13
- print np.eye(3)#产生单位矩阵,输入参数为阶数
- 14
- print np.arange(10)
- 15
- print np.arange(1,10,2)#np.arange(开始,结束,步长),其中开始可以省略(默认为0)步长可以省略(默认为1)
- 16
- #如果想产生从大到小的数组可以通过如下的方式产生
- 17
- print np.arange(10,0,-1)
复制代码 全是0的五位数组:
[ 0. 0. 0. 0. 0.]全是1的五维数组: [ 1. 1. 1. 1. 1.]全是0的3*3数组: [[ 0. 0. 0.] [ 0. 0. 0.] [ 0. 0. 0.]]全是1的3*3数组: [[ 1. 1. 1.] [ 1. 1. 1.] [ 1. 1. 1.]]全是1的3*3*3数组: [[[ 1. 1.] [ 1. 1.]] [[ 1. 1.] [ 1. 1.]]][[ 1. 1. 1.] [ 1. 1. 1.] [ 1. 1. 1.]][[1 1 1 1] [1 1 1 1]][[0 0 0 0] [0 0 0 0]][[ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]][0 1 2 3 4 5 6 7 8 9][1 3 5 7 9][10 9 8 7 6 5 4 3 2 1]- '''
- 数组的运算
- '''
- arr = np.array([[1.,2.,3.],[4.,5.,6.]])
- print("The square of arr is :",arr*arr)
- print("1/arr = ",1/arr)
- print("arr-arr:",arr-arr)
- print("A half of arr is :",arr*0.5)
复制代码 ('The square of arr is :', array([[ 1., 4., 9.], [ 16., 25., 36.]]))
('1/arr = ', array([[ 1. , 0.5 , 0.33333333], [ 0.25 , 0.2 , 0.16666667]]))('arr-arr:', array([[ 0., 0., 0.], [ 0., 0., 0.]]))('A half of arr is :', array([[ 0.5, 1. , 1.5], [ 2. , 2.5, 3. ]]))
- '''
- 切片和索引:一维数组
- '''
- #np.arange()函数是range内置函数的array版本
- arr1 = np.arange(10)
- print arr1
- #同list的切片,index从0开始,arr[i]就是第i+1个元素
- print arr1[5]
- #这个就尴尬了,arr[i:j]表示从第i+1个元素开始向后数j-i个元素拿出来
- print arr1[5:8]
- #ndarray作为迭代器iterator
- for i in arr1:
- arr1[i]=10-i
-
- print arr1
- #切片后的部分还是原来array的一部分,如果对切片进行修改的话会影响到原有的array的
- #如果希望将切片后的array单独保存,可以使用array[].copy()
复制代码 [0 1 2 3 4 5 6 7 8 9]
5[5 6 7][10 9 8 7 6 5 4 3 2 1]
- '''
- 切片和索引:高维数组
- '''
- arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])#小括号里有两层中括号
- print arr2d
- print arr2d[0][2]#等价于arr2d[0,2]
- arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
- print
- print arr3d
- print
- print arr3d[0]#三维数组的一个切片是一个二维数组
复制代码 [[1 2 3] [4 5 6] [7 8 9]]
3[[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]][[1 2 3] [4 5 6]]
- #二维的array的切片如果仅仅有一个维度默认的是行向切片的,而且[:2]等价于[0:2]
- print arr2d[:2]
- #如果切片传入两个参数,第一个参数从行向切片,第二个从列向切片。最后切出来是个矩阵
- print arr2d[:2,1:]
- print arr2d[:,:1]
复制代码 [[1 2 3] [4 5 6]]
[[2 3] [5 6]][[1] [4] [7]]
- #Bool型索引
- names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
- data = np.random.randn(7,4)
- names == 'Bob'
- #利用Bool数组对array进行切片,最后切出来的是第一行和第四行,因为只有这两行的Bool值为True
- #Bools的维度和array的需要切片的维度要相同,
- data[names == 'Bob']
- data[-(names == 'Bob')]
- #Bool值里面的逻辑运算 |或 &且 !=非 或者直接在前面加负号
- mask = (names == 'Bob')|(names == 'Will')
- data[mask]
- data[data<0] = 0
- print data
复制代码 [[ 1.73468624 0.03652492 1.01359411 0.95894325] [ 0.24481808 0.10041709 0. 0. ] [ 0. 0.99979847 0. 0.37789161] [ 0.24150958 0.75716877 0. 0. ] [ 0.47633598 0.22929087 0. 0.91475764] [ 0. 0. 0.45932134 0.26343811] [ 0.80821826 0. 0. 0. ]]
- #Fancy Indexing
- arr2 = np.empty((8,4))
- for i in range(8):
- arr2[i] = i
-
- print arr2
- #传入的list相当于给了一个顺序,指定切出array里面的第几行并按照list的顺序排列,如果list里面给的是负数,就从后往前数
- arr2[[4,3,0,6]]
- arr2[[-3,-5,-7]]
复制代码 [[ 0. 0. 0. 0.] [ 1. 1. 1. 1.] [ 2. 2. 2. 2.] [ 3. 3. 3. 3.] [ 4. 4. 4. 4.] [ 5. 5. 5. 5.] [ 6. 6. 6. 6.] [ 7. 7. 7. 7.]]
array([[ 5., 5., 5., 5.], [ 3., 3., 3., 3.], [ 1., 1., 1., 1.]])
- #Fancy Indexing 2
- print "输出的是(1,0),(5,3)上面的元素"
- print arrr[[1,5,7,2],[0,3,1,2]]
- print "输出的是行列index交叉以后的元素,可以构成一个矩阵"
- print arrr[[1,5,7,2]][:,[0,3,1,2]]
- print "同上面的方法,用np.ix_函数"
- print arrr[np.ix_([1,5,7,2],[0,3,1,2])]
复制代码- 输出的是(1,0),(5,3)上面的元素
- ---------------------------------------------------------------------------
- NameError Traceback (most recent call last)
- <mercury-input-12-DD1667028419416A87EC6CDDAC3F1604> in <module>()
- 1 #Fancy Indexing 2
- 2 print "输出的是(1,0),(5,3)上面的元素"
- ----> 3 print arrr[[1,5,7,2],[0,3,1,2]]
- 4 print "输出的是行列index交叉以后的元素,可以构成一个矩阵"
- 5 print arrr[[1,5,7,2]][:,[0,3,1,2]]
- NameError: name 'arrr' is not defined
复制代码- #数组transpose等等
- arrrr = np.arange(15).reshape((3,5))
- print arrrr
- print "After transpose:"
- print arrrr.T
- print "内积的计算"
- print np.dot(arrrr.T,arrrr)
- #同时转置也可以用swapaxes函数
- print "用swapaxes进行二维数组的转置"
- print arrrr.swapaxes(1,1)
复制代码- #Numpy里的通用函数
- ar = np.arange(10)
- print "平方根",np.sqrt(ar)
- print "自然对数",np.exp(ar)
- x = np.random.randn(8)
- y = np.random.randn(8)
- print "x=",x
- print "y=",y
- print "同位置元素最大的构成的array",np.maximum(x,y)
- print "np.modf用于返回一个array的整数部分和小数部分,返回两个数组",np.modf(x)
- print np.power(x,y)#相当于x的y次方
- print np.add(x,y)#加法的array版本
- print np.subtract(x,y)#减法的array版本
- print np.multiply(x,y)#乘法的array版本
- print np.divide(x,y)#除法的array版本
- print np.floor_divide(x,y)#丢弃余数的除法
- #此外还有一系列比较大小的运算函数,此外还有np.logical系列用于逻辑运算
复制代码- #利用array进行数据处理
- points = np.arange(15,5,0.01)
- xs,ys = np.meshgrid(points,points)
- import matplotlib.pyplot as plt
- z = np.sqrt(xs ** 2 + ys ** 2)
- plt.imshow(z,cmap=plt.cm.gray);plt.colorbar()
- plt.title("Image plot of $\sqrt{x^2+y^2}$ for a grid of values")
复制代码- #利用数组进行逻辑运算
- 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])
- print "如果cond里是True就输出xarr里的元素否则输出yarr里的:"
- print [(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
- print "如果用np.where(cond,x,y)处理的话是相同的方法:"
- print np.where(cond,xarr,yarr)
- zarr = np.random.randn(4,4)
- print zarr
- print "如果元素大于0输出2,否则输出-2"
- print np.where(zarr >0,2,-2)
- print "如果元素大于0则输出2,否则保留原值"
- print np.where(zarr>0,2,zarr)
- #np.where的嵌套:np.where(cond1&cond2,0,np.where(cond1,1,np.where(cond2,2,3)))
- #更复杂的形式是 result = 1*(cond1 -cond2)+2*(cond2& -cond1) +3*-(cond1|cond2) 虽然有点烧脑 但是还是可以看明白的
- #这就提醒我们不能为了装逼把代码写的太短别人看起来烧脑
复制代码
|
|