numpy学习笔记

整理:杨柳依
【numpy学习笔记】参考资料:《Numpy学习指南(第2版)》
1. numpy 数组 1.1 创建数组
以下省略from numpy import *
  • 创建一维数组
    >>> a = arange(5) # 创建一维数组 >>> b = array([1,2,3,4,5]) # 创建一维数组 >>> c = array([1,2,3,4,5], dtype=int64) # 指定数据类型 >>> d = array([1,2,3.5])# 传入的list必须是同一类型,否则会自动转换

  • 创建多维数组
    >>> a = array([[1,2,3],[4,5,6]])# 创建二维数组 >>> a.shape# (2, 3) >>> a.ndim# 2 >>> a[1,0]# 4

  • 获取数组属性
    >>> a = arange(5) # array([0, 1, 2, 3, 4])>>> a.dtype # 获取类型 dtype('int32') >>> a.shape # 获取形状,返回一个元祖,可以看出是一维数组 (5,) >>> a.ndim# 获取维度,返回一个数字 1 >>> a.size # 返回元素总个数 5 >>> a.itemsize# 返回数组单个元素所占字节数 4 >>> a.nbytes# 返回数组所占总空间 20 >> a.T# 转置,对于一维数组无变化

    对于复数元素,有
    >>> b = array([1+2j,2+4j])# array([1.+2.j, 2.+4.j])>>> b.real# 获取实部 array([1., 2.])>>> b.imag# 获取虚部 array([2., 4.])

    特别的,使用flat属性获取一个迭代器
    >>> a = array([[1,2,3],[4,5,6]]) >>> f = a.flat >>> for i in a.flat: print(i," ",type(i)) 1 2 3 4 5 6# 注意,使用一个for循环无法取到每一个元素,只能取出[1,2,3]和[4,5,6]>>> a.flat = 9 # 对flat属性赋值会覆盖所有元素 >>> a array([[9, 9, 9], [9, 9, 9]])

1.2 数组切片
  • 一维数组切片
    >>> a = arange(10)# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>> a[3:7] array([3, 4, 5, 6])>>> a[3:7:2]# 步长为2 array([3, 5])>>> a[::-1]# 步长为-1,相当于翻转 array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])

  • 多维数组切片
    >>> a = array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])>>> a[:,0]# 获取第1列,得到一维数组 array([1, 5, 9])>>> a[0,:]# 获取第1行,得到一维数组 array([1, 2, 3, 4])>>> b = array(([[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]]))>>> b[0,:,:]# 获取第1张表上的所有数据 array([[1, 2, 3], [4, 5, 6]]) >>> b[0,...]# 同上,多个连续的冒号(:)可以用省略号(...)代替 >>> b[0]# 同上,后面的冒号可以直接省略>>> b[0,:,-1] # 获取第1张表上所有行最后一列的数据 array([3, 6])>>> b[0,:,::-1]# 将第1张表上所有行的列元素倒序排列 array([[3, 2, 1], [6, 5, 4]])

1.3 改变数组维度
  • 展平数组(降成一维)
    >>> b = array(([[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]]))>>> b.ravel() # 不改变原数组 array([ 1,2,3,4,5,6,7,8,9, 10, 11, 12])>>> b.flatten()# 不改变原数组 array([ 1,2,3,4,5,6,7,8,9, 10, 11, 12])

  • 设置维度
    元素个数要与设置的维度相匹配,不然会报错
    >> b.shape = (2,6)# 改变原数组,变为2×6的数组,[[1,2,3,4,5,6],[7,8,9,10,11,12]] >> b.resize((4,3))# 改变原数组,变为4×3的数组 >> b.reshape((3,4))# 不改变原数组,返回3×4的数组

  • 数组转置
    >>> b = array([[1,2,3,4]]) >>> b.transpose() # 不改变原数组,返回转置后的数组,[[1],[2],[3],[4]] >>> b.T# 同上

1.4 数组的组合
先产生一些数组
>>> a = arange(9).reshape(3,3) >>> b = arange(11,14).reshape(1,3) >>> c = 2*a>>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> b array([[11, 12, 13]])>>> c array([[ 0,2,4], [ 6,8, 10], [12, 14, 16]])

  • 水平组合
    >>> hstack((a,b.T)) array([[ 0,1,2, 11], [ 3,4,5, 12], [ 6,7,8, 13]])>>> concatenate((a,b.T),axis=1) array([[ 0,1,2, 11], [ 3,4,5, 12], [ 6,7,8, 13]])

  • 垂直组合
    >>> vstack((a,b)) array([[ 0,1,2], [ 3,4,5], [ 6,7,8], [11, 12, 13]])>>> concatenate((a,b),axis=0) # concatenate函数axis参数默认为0,垂直组合 array([[ 0,1,2], [ 3,4,5], [ 6,7,8], [11, 12, 13]])

  • 深度组合
    >>> dstack((a,c)) array([[[ 0,0], [ 1,2], [ 2,4]],[[ 3,6], [ 4,8], [ 5, 10]],[[ 6, 12], [ 7, 14], [ 8, 16]]])

  • 列组合
    >>> column_stack((b,b)) array([[11, 12, 13, 11, 12, 13]]) # 对于二维数组,相当于hstack

  • 行组合
    >>> row_stack((b,b)) array([[11, 12, 13], [11, 12, 13]])# 对于二维数组,相当于vstack

1.5 数组的分割
  • 水平分割
    >>> hsplit(a,3) [array([[0], [3], [6]]), array([[1], [4], [7]]), array([[2], [5], [8]])]>>> split(a,3,axis=1) # 与hsplit相同

  • 垂直分割
    >>> vsplit(a,3) [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]>>> split(a,3,axis=0) # 与vsplit相同

  • 深度分割
    >>> d = arange(8).reshape(2,2,2) >>> dsplit(d,2) [array([[[0], [2]], [[4], [6]]]), array([[[1], [3]], [[5], [7]]])]

    推荐阅读