找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 5050|回复: 1

Numpy学习笔记 (上篇)

3

主题

3

帖子

3

积分

贫民

积分
3
mushroomqiu 发表于 2017-1-9 15:31:43 | 显示全部楼层 |阅读模式
  • 基于Wes McKinney的Python for Data Analysis第四章NumPy Basics: Arrays and Vectorized Computation整理代码得来。
    最近在自学Python,感觉还是要敲一下的,又懒得在书上做笔记,所以在Notebook上写写喽。
    有需要的尽管参考~谢谢
    1. import numpy as np
    复制代码

    1. #通过np.array()用list创建一维数组
    2. #list是用[]括起来的,元素之间用逗号
    3. data1 = [6,7.5,8,0,1]
    4. arr1 = np.array(data1)
    5. print arr1
    6. type(data1)
    复制代码
    [ 6.   7.5  8.   0.   1. ]

    list
    1. #通过np.array()用list创建二维数组
    2. #list是用[]括起来的,每行是一个[],不同行之间用逗号

    3. data2 = [[1,2,3,4],[5,6,7,8]]
    4. arr2 = np.array(data2)
    5. print arr2
    复制代码
    [[1 2 3 4] [5 6 7 8]]
    1. #查看数组的位数和形状以及数据类型
    2. print arr2.shape
    3. print arr2.ndim
    4. print arr1.dtype
    5. print arr2.dtype
    复制代码
    (2, 4)
    2float64int64
  • #可以通过制定dtype来强制显性规定数组内元素的数据类型
    #可以用过np.asdtype来转换ndarray里面的元素的数据类型,如果非数字类型的list强制转化会报错

    1. """
    2. 2
    3. 通过numpy的函数来新建数组
    4. 3
    5. """
    6. 4

    7. 5
    8. print '全是0的五位数组:',np.zeros(5)
    9. 6
    10. print '全是1的五维数组:',np.ones(5)
    11. 7
    12. print '全是0的3*3数组:',np.zeros((3,3))
    13. 8
    14. print '全是1的3*3数组:',np.ones((3,3))
    15. 9
    16. print '全是1的3*3*3数组:',np.ones((2,2,2))
    17. 10
    18. print np.empty((3,3))
    19. 11
    20. print np.ones_like(arr2)#生成一个维度如同括号内数组的全是0的数组,传入的参数为ndarry格式
    21. 12
    22. print np.zeros_like(arr2)
    23. 13
    24. print np.eye(3)#产生单位矩阵,输入参数为阶数
    25. 14
    26. print np.arange(10)
    27. 15
    28. print np.arange(1,10,2)#np.arange(开始,结束,步长),其中开始可以省略(默认为0)步长可以省略(默认为1)
    29. 16
    30. #如果想产生从大到小的数组可以通过如下的方式产生
    31. 17
    32. 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]
    1. '''
    2. 数组的运算
    3. '''
    4. arr = np.array([[1.,2.,3.],[4.,5.,6.]])
    5. print("The square of arr is :",arr*arr)
    6. print("1/arr = ",1/arr)
    7. print("arr-arr:",arr-arr)
    8. 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. ]]))
    1. '''
    2. 切片和索引:一维数组
    3. '''
    4. #np.arange()函数是range内置函数的array版本
    5. arr1 = np.arange(10)
    6. print arr1
    7. #同list的切片,index从0开始,arr[i]就是第i+1个元素
    8. print arr1[5]
    9. #这个就尴尬了,arr[i:j]表示从第i+1个元素开始向后数j-i个元素拿出来
    10. print arr1[5:8]
    11. #ndarray作为迭代器iterator
    12. for i in arr1:
    13.     arr1[i]=10-i
    14.    
    15. print arr1

    16. #切片后的部分还是原来array的一部分,如果对切片进行修改的话会影响到原有的array的
    17. #如果希望将切片后的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]

    1. '''
    2. 切片和索引:高维数组
    3. '''
    4. arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])#小括号里有两层中括号
    5. print arr2d

    6. print arr2d[0][2]#等价于arr2d[0,2]

    7. arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
    8. print
    9. print arr3d
    10. print
    11. 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]]


    1. #二维的array的切片如果仅仅有一个维度默认的是行向切片的,而且[:2]等价于[0:2]
    2. print arr2d[:2]
    3. #如果切片传入两个参数,第一个参数从行向切片,第二个从列向切片。最后切出来是个矩阵
    4. print arr2d[:2,1:]
    5. print arr2d[:,:1]
    复制代码
    [[1 2 3] [4 5 6]]
    [[2 3] [5 6]][[1] [4] [7]]



    1. #Bool型索引
    2. names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
    3. data = np.random.randn(7,4)
    4. names == 'Bob'
    5. #利用Bool数组对array进行切片,最后切出来的是第一行和第四行,因为只有这两行的Bool值为True
    6. #Bools的维度和array的需要切片的维度要相同,
    7. data[names == 'Bob']
    8. data[-(names == 'Bob')]
    9. #Bool值里面的逻辑运算 |或 &且 !=非 或者直接在前面加负号
    10. mask = (names == 'Bob')|(names == 'Will')
    11. data[mask]

    12. data[data<0] = 0
    13. 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.        ]]



    1. #Fancy Indexing
    2. arr2 = np.empty((8,4))
    3. for i in range(8):
    4.     arr2[i] = i
    5.    
    6. print arr2
    7. #传入的list相当于给了一个顺序,指定切出array里面的第几行并按照list的顺序排列,如果list里面给的是负数,就从后往前数
    8. arr2[[4,3,0,6]]
    9. 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.]])




    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]]
    6. print "同上面的方法,用np.ix_函数"
    7. print arrr[np.ix_([1,5,7,2],[0,3,1,2])]
    复制代码
    1. 输出的是(1,0),(5,3)上面的元素
    2. ---------------------------------------------------------------------------
    3. NameError                                 Traceback (most recent call last)
    4. <mercury-input-12-DD1667028419416A87EC6CDDAC3F1604> in <module>()
    5.       1 #Fancy Indexing 2
    6.       2 print "输出的是(1,0),(5,3)上面的元素"
    7. ----> 3 print arrr[[1,5,7,2],[0,3,1,2]]
    8.       4 print "输出的是行列index交叉以后的元素,可以构成一个矩阵"
    9.       5 print arrr[[1,5,7,2]][:,[0,3,1,2]]

    10. NameError: name 'arrr' is not defined
    复制代码
    1. #数组transpose等等
    2. arrrr = np.arange(15).reshape((3,5))
    3. print arrrr
    4. print "After transpose:"
    5. print arrrr.T
    6. print "内积的计算"
    7. print np.dot(arrrr.T,arrrr)
    8. #同时转置也可以用swapaxes函数
    9. print "用swapaxes进行二维数组的转置"
    10. print arrrr.swapaxes(1,1)
    复制代码
    1. #Numpy里的通用函数
    2. ar = np.arange(10)
    3. print "平方根",np.sqrt(ar)
    4. print "自然对数",np.exp(ar)
    5. x = np.random.randn(8)
    6. y = np.random.randn(8)
    7. print "x=",x
    8. print "y=",y
    9. print "同位置元素最大的构成的array",np.maximum(x,y)
    10. print "np.modf用于返回一个array的整数部分和小数部分,返回两个数组",np.modf(x)
    11. print np.power(x,y)#相当于x的y次方
    12. print np.add(x,y)#加法的array版本
    13. print np.subtract(x,y)#减法的array版本
    14. print np.multiply(x,y)#乘法的array版本
    15. print np.divide(x,y)#除法的array版本
    16. print np.floor_divide(x,y)#丢弃余数的除法
    17. #此外还有一系列比较大小的运算函数,此外还有np.logical系列用于逻辑运算
    复制代码
    1. #利用array进行数据处理
    2. points = np.arange(15,5,0.01)
    3. xs,ys = np.meshgrid(points,points)
    4. import matplotlib.pyplot as plt
    5. z = np.sqrt(xs ** 2  + ys ** 2)
    6. plt.imshow(z,cmap=plt.cm.gray);plt.colorbar()
    7. plt.title("Image plot of $\sqrt{x^2+y^2}$ for a grid of values")
    复制代码
    1. #利用数组进行逻辑运算
    2. xarr = np.array([1.1,1.2,1.3,1.4,1.5])
    3. yarr = np.array([2.1,2.2,2.3,2.4,2.5])
    4. cond = np.array([True,False,True,True,False])
    5. print "如果cond里是True就输出xarr里的元素否则输出yarr里的:"
    6. print [(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
    7. print "如果用np.where(cond,x,y)处理的话是相同的方法:"
    8. print np.where(cond,xarr,yarr)

    9. zarr = np.random.randn(4,4)
    10. print zarr
    11. print "如果元素大于0输出2,否则输出-2"
    12. print np.where(zarr >0,2,-2)
    13. print "如果元素大于0则输出2,否则保留原值"
    14. print np.where(zarr>0,2,zarr)
    15. #np.where的嵌套:np.where(cond1&cond2,0,np.where(cond1,1,np.where(cond2,2,3)))
    16. #更复杂的形式是 result = 1*(cond1 -cond2)+2*(cond2& -cond1) +3*-(cond1|cond2) 虽然有点烧脑 但是还是可以看明白的
    17. #这就提醒我们不能为了装逼把代码写的太短别人看起来烧脑
    复制代码


回复

使用道具 举报

0

主题

30

帖子

30

积分

版主

Rank: 7Rank: 7Rank: 7

积分
30

活跃会员热心会员突出贡献荣誉管理

鸟笨Andy 发表于 2017-3-21 11:10:06 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表