Numpy学习笔记

Numpy(Numerical Python的简称)高性能科学计算和数据分析的基础包。其部分功能如下:

  • ndarray,具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
  • 数组运算,不用编写循环
  • 可以读写磁盘数据,操作内存映射
  • 线性代数
  • 集成c,c++等语言

python能够包装c、c++以numpy数组形式的数据。pandas提供了结构化或表格化数据的处理高级接口,

还提供了numpy不具备的时间序列处理等;


1 创建ndarray
ndarray多维数组,要求所有元素的类型一致,通常说的“数组”、“Numpy数组”、“ndarray”都是指“ndarray”对象。

In [1]: import numpy as np

In [2]: np.arange(10)//创建从0到9的包含10个元素的一维数组
Out[2]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [3]: np.array([1,2,3,4,5])//输入数据转换为ndarray对象,可以是python元组、列表或其他序列类型。可以自动识别dtype,或者手动指定类型
Out[3]: array([1, 2, 3, 4, 5])

In [4]: np.ones((2,3))//包含2个数组对象的数组,每个数组对象里包含3个都为1.0的元素
Out [4]: array([[ 1.,  1.,  1.],
			   [ 1.,  1.,  1.]])

In [5]: np.ones_like([1,2,3,4,5])//返回一个用1填充的跟输入 形状和类型 一致的数组
Out[5]: array([1, 1, 1, 1, 1])			   
			   
In [6]: np.zeros((2,5))//包含2个数组对象的数组,每个数组对象里包含5个都为0.0的元素
Out[6]: array([[ 0.,  0.,  0.,  0.,  0.],
               [ 0.,  0.,  0.,  0.,  0.]])
			   
In [7]: np.zeros_like((2,5))//返回一个用0填充的跟输入 形状和类型 一致的数组
Out[7]: array([0, 0])

In [8]: np.eye(2)//创建一个2*2的单位矩阵(阵列)
Out[8]: array([[ 1.,  0.],
               [ 0.,  1.]])
			
In [9]: np.identity(2)//创建一个2*2的单位矩阵(阵列)
Out[9]: array([[ 1.,  0.],
               [ 0.,  1.]])

In [10]: np.empty((2,3))//包含2个数组对象的数组,每个数组对象里包含3个都为空的元素,全空数组,只分配内存空间,不填充任何值
Out[10]: array([[ 0.,  0.,  0.],
			   [ 0.,  0.,  0.]])
			   
In [11]: np.empty((3,3))//包含3个数组对象的数组,每个数组对象里包含3个都为空的元素,全空数组,只分配内存空间,不填充任何值
Out[11]: array([[  1.77010735e-290,   1.77018564e-290,   1.77026392e-290],
                [  1.77034221e-290,   1.77042050e-290,   7.77725110e-071],
                [  7.40790129e-038,   4.70504460e-086,   5.89204343e+294]])
				
In [12]: np.empty((3,4))//包含3个数组对象的数组,每个数组对象里包含4个都为空的元素,全空数组,只分配内存空间,不填充任何值
Out[12]: array([[  3.31023983e-322,   0.00000000e+000,   0.00000000e+000,0.00000000e+000],
                [  0.00000000e+000,   0.00000000e+000,   0.00000000e+000,0.00000000e+000],
                [  0.00000000e+000,   0.00000000e+000,   0.00000000e+000,0.00000000e+000]])


2 ndarray数据类型
当需要控制数据在内存和磁盘中的存储方式时,尤其是大数据集,就需要了解如何控制存储类型。
dtype的表示形式有几种:
类型列中的值,使用字符串方式:如“int8”;
类型列中的值,使用如np.int8表示;
类型代码列中的值,使用字符串表示,如“f2”;

下表是所有支持的类型和说明:

也可以使用astype修改dtype

在格式转换过程中:

  • 浮点数转换成整数,浮点数小数部分会被去掉;
  • 如果字符串格式的数字,可以转换为数值形式;
  • 复数转换
In [13]: a = np.array([1,2,3],dtype="int32")//指定数组类型为int32
In [13]: a.dtype
Out[13]: dtype('int32')

In [14]: b = np.array([1,3,3],dtype=np.float32)//指定数组类型为float64
In [14]: b.dtype
Out[14]: dtype('float32')				
				
In [15]: c = a.astype("float64")//把a数组类型由int32转换成float64
In [15]: c.dtype
Out[15]: dtype('float32')

In [16]: vector = np.array([5,10,15,20])//把传入的结构转换成ndarray对象
		 matrix = np.array([[5,10,15],[20,25,30],[35,40,45]])
		 print vector
		 print matrix				
Out[16]: [ 5 10 15 20]
		 [[ 5 10 15]
		  [20 25 30]
		  [35 40 45]]				
				
In [17]: print vector.shape//查看数组的结构
		 print matrix.shape				
Out[17]: (4,)//一维数组包含4个元素
         (3, 3)	//三维数组,每个包含3个元素			
				
In [18]: numbers = np.array([1,2,3,4])//转换成ndarray后数据类型变成一致
         print numbers
         print numbers.dtype				
Out[18]: [1 2 3 4]
         int32			
				
In [19]: numbers = np.array([1,2,3,4.0])//转换成ndarray后数据类型变成float64
         print numbers
         print numbers.dtype				
Out[19]: [ 1.  2.  3.  4.]
         float64				
				
In [20]: numbers = np.array([1,2,3,"4"])//转换成ndarray后数据类型变成|S11
         print numbers
         print numbers.dtype				
Out[20]: ['1' '2' '3' '4']
         |S11				
			
		 //从文件读取数据,数据每一行的分隔符为",",以字符串的形式读取,跳过前面的一行	
In [21]: world_alcoho = np.genfromtxt("world_alcohol.txt",delimiter = ",",dtype = str,skip_header = 1)
         print world_alcoho				
Out[21]: [['1986' 'Western Pacific' 'Viet Nam' 'Wine' '0']
          ['1986' 'Americas' 'Uruguay' 'Other' '0.5']
          ['1985' 'Africa' "Cte d'Ivoire" 'Wine' '1.62']
          ..., 
          ['1987' 'Africa' 'Malawi' 'Other' '0.75']
          ['1989' 'Americas' 'Bahamas' 'Wine' '1.5']
          ['1985' 'Africa' 'Malawi' 'Spirits' '0.31']]				

		 //切片取值,索引从0开始,取第1行第4列的元素	
In [22]: uruguay_other_1986 = world_alcoho[1,4]
         third_country = world_alcoho[2,2]//取第2行第2列的元素
		 print uruguay_other_1986
         print third_country
Out[22]: 0.5
         Cte d'Ivoire
	
In [23]: vector = np.array([10,20,30,40,50])
         print vector[1:3]//从索引1开始取到索引3但不包括3,左闭右开的区间
Out[23]: [20 30]

In [24]: matrix = np.array([[5,10,15],[20,25,30],[35,40,45]])
         print matrix
         print "--------------"
         print matrix[:,1]//:表示取所有行,1:表示取第一列
Out[24]: [[ 5 10 15]
          [20 25 30]
          [35 40 45]]
         --------------
         [10 25 40]

In [25]: print matrix[:,0:2]//:表示取所有行,0:2表示取第0列和第1列
Out[25]: [[ 5 10]
          [20 25]
          [35 40]]

In [26]: vector = np.array([10,20,30,40,50])
         vector == 10  //判断数组中有没有等于10的
Out[26]: array([ True, False, False, False, False], dtype=bool)

         //判断矩阵中有没有等于25的
In [27]: matrix = np.array([[5,10,15],[20,25,30],[35,40,45]])
         print matrix
         print "--------------"
         matrix == 25
Out[27]: [[ 5 10 15]
          [20 25 30]
          [35 40 45]]
         --------------
         [[False False False]
          [False  True False]
          [False False False]]
        
		//通过布尔值作为索引反过来取值
In [28]: vector = np.array([10,20,30,40,50])
         equal_to_ten = (vector == 10)
         print equal_to_ten
         print vector[equal_to_ten]
Out[28]: [ True False False False False]
         [10]

		//通过布尔值作为索引反过来取值
In [29]: matrix = np.array([[5,10,15],[20,25,30],[35,40,45]])
         second_column_25 = (matrix[:,1]==25)//第一列等于25的
         print matrix
         print "--------------"
		 print second_column_25
		 print "--------------"
         print matrix[second_column_25,:]//25所在的一行
Out[29]: [[ 5 10 15]
          [20 25 30]
          [35 40 45]]
         --------------
         [False  True False]
         --------------
         [[20 25 30]]

		//与操作
In [30]: vector = np.array([10,20,30,40,50])
         equal_to_ten_and_five = (vector == 10) & (vector ==5)
         print equal_to_ten_and_five
Out[30]: [False False False False False]

		//或操作
In [31]: vector = np.array([10,20,30,40,50])
         equal_to_ten_and_five = (vector == 10) | (vector ==50)
         print equal_to_ten_and_five
Out[31]: [True False False False True]

		//类型转换
In [32]: vector = np.array(["1","2","3"])
         print vector
         print vector.dtype
         vector = vector.astype(float)//转换成float类型
         print vector
         print vector.dtype
Out[32]: ['1' '2' '3']
         |S1
         [ 1.  2.  3.]
         float64

		//获取最大值和最小值
In [33]: vector = np.array([10,20,30,40,50])
         print vector.min()
         print vector.max()
         print(help(np.array))//查看帮助文档
Out[33]: 10
         50

		//按维度求和
In [34]: matrix = np.array([[5,10,15],[20,25,30],[35,40,45]])
         print matrix
         print "--------------"
         print matrix.sum(axis=1)//按行求和
Out[34]: [[ 5 10 15]
          [20 25 30]
          [35 40 45]]
         --------------
         [ 30  75 120]

		//按维度求和
In [35]: matrix = np.array([[5,10,15],[20,25,30],[35,40,45]])
         print matrix
         print "--------------"
         print matrix.sum(axis=0)//按列求和
Out[35]: [[ 5 10 15]
          [20 25 30]
          [35 40 45]]
         --------------
         [60 75 90]


2017-10-18 22:11

		//数组的变换
In [36]: a = np.arange(15)
         print a
         print "--------------"
         print a.reshape(3,5)//把a数组变换成3行5列的矩阵
		 print "--------------"
         b = a.reshape(3,5)
         print b.shape//打印b矩阵的结构
		 print "--------------"
         print b.ndim//打印b矩阵的维度
         print "--------------"
         print b.dtype.name//打印b矩阵的数据类型
         print "--------------"
         print b.size//打印b矩阵的元素个数
Out[36]: [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
         --------------
         [[ 0  1  2  3  4]
          [ 5  6  7  8  9]
          [10 11 12 13 14]]
         --------------
         (3, 5)
         --------------
         2
         --------------
         int32
         --------------
         15

		 //构造全0和全1矩阵
In [37]: a = np.zeros((3,4))//3行4列的全0矩阵
         print a
         b = np.ones((3,4),dtype = np.int32)//3行4列的全1矩阵
         print "--------------"
         print b
Out[37]: [[ 0.  0.  0.  0.]
          [ 0.  0.  0.  0.]
          [ 0.  0.  0.  0.]]
         --------------
         [[1 1 1 1]
          [1 1 1 1]
          [1 1 1 1]]

		 //构造等差数组
In [38]: a = np.arange(10,30,5)//10到30(不包括30)的等差为5的数组
         print a
Out[38]: [10 15 20 25]

		 //构造随机数矩阵
In [39]: a = np.random.random((2,3))//2行3列的随机数矩阵
         print a
Out[39]: [[ 0.37568206  0.73577444  0.75831937]
          [ 0.50737538  0.04136392  0.18015326]]

		 //构造等差数组
In [40]: from numpy import pi
         a = np.linspace(0,2*pi,10)//0到2*Pi之间10个数的等差数列
         print a
Out[40]: [ 0.          0.6981317   1.3962634   2.0943951   2.7925268   3.4906585
           4.1887902   4.88692191  5.58505361  6.28318531]

		//数组运算
In [41]: a = np.array([20,30,40,50])
         b = np.arange(4)
         print a
         print "--------------"
         print b
         print "--------------"
         c = a - b
         print c
         print "--------------"
         print b**2//求平方
         print "--------------"
         print a<35
Out[41]: [20 30 40 50]
         --------------
         [0 1 2 3]
         --------------
         [20 29 38 47]
         --------------
         [0 1 4 9]
         --------------
         [ True  True False False]

		//矩阵运算
In [42]: A = np.array([[1,1],[0,1]])
         B = np.array([[2,0],[3,4]])
         print A
         print "--------------"
         print B
         print "--------------"
         C = a * b//对应位置相乘
         print C
         print "--------------"
         print A.dot(B)//矩阵相乘
         print "--------------"
         print np.dot(A,B)//矩阵相乘
Out[42]: [[1 1]
          [0 1]]
         --------------
         [[2 0]
          [3 4]]
         --------------
         [  0  30  80 150]
         --------------
         [[5 4]
          [3 4]]
         --------------
         [[5 4]
          [3 4]]

		//矩阵变换
In [43]: a = np.floor(10*np.random.random((3,4)))//随机生成3行4列的矩阵,每个数向下取整
         print a
         print "--------------"
         print a.ravel()//把矩阵变成向量
         print "--------------"
         a.shape = (6,2)//变换成6行2列的矩阵
         print a
         print "--------------"
         print a.T//矩阵的转置
		 print "--------------"
         print a.reshape(3,-1)//根据a中的元素个数自动计算-1的真实值
Out[43]: [[ 8.  9.  1.  9.]
          [ 3.  9.  0.  0.]
          [ 3.  6.  1.  1.]]
         --------------
         [ 8.  9.  1.  9.  3.  9.  0.  0.  3.  6.  1.  1.]
         --------------
         [[ 8.  9.]
          [ 1.  9.]
          [ 3.  9.]
          [ 0.  0.]
          [ 3.  6.]
          [ 1.  1.]]
         --------------
         [[ 8.  1.  3.  0.  3.  1.]
          [ 9.  9.  9.  0.  6.  1.]]
         --------------
         [[ 8.  9.  1.  9.]
          [ 3.  9.  0.  0.]
          [ 3.  6.  1.  1.]]

		//矩阵合并
In [44]: a = np.floor(10*np.random.random((2,2)))
         b = np.floor(10*np.random.random((2,2)))
         print a
         print "--------------"
         print b
         print "--------------"
         print np.hstack((a,b))//横向合并
         print "--------------"
         print np.vstack((a,b))//纵向合并
Out[44]: [[ 1.  2.]
          [ 6.  8.]]
         --------------
         [[ 5.  0.]
          [ 4.  2.]]
         --------------
         [[ 1.  2.  5.  0.]
          [ 6.  8.  4.  2.]]
         --------------
         [[ 1.  2.]
          [ 6.  8.]
          [ 5.  0.]
          [ 4.  2.]]

		//矩阵切分
In [45]: a = np.floor(10*np.random.random((2,12)))
         print a
         print "--------------"
         print np.hsplit(a,3)//把a矩阵横向平均切分成3份
         print "--------------"
         print np.hsplit(a,(3,4))把a矩阵在3的位置切一次,在4的位置切一次
         print "--------------"
         a = np.floor(10*np.random.random((12,2)))
         print np.vsplit(a,3)//把a矩阵纵向平均切分成3份
Out[45]: [[ 0.  3.  8.  8.  4.  9.  1.  9.  5.  9.  6.  7.]
          [ 0.  1.  6.  1.  0.  4.  0.  9.  9.  5.  8.  1.]]
         --------------
         [array([[ 0.,  3.,  8.,  8.],
                [ 0.,  1.,  6.,  1.]]), array([[ 4.,  9.,  1.,  9.],
                [ 0.,  4.,  0.,  9.]]), array([[ 5.,  9.,  6.,  7.],
                [ 9.,  5.,  8.,  1.]])]
         --------------
         [array([[ 0.,  3.,  8.],
                [ 0.,  1.,  6.]]), array([[ 8.],
                [ 1.]]), array([[ 4.,  9.,  1.,  9.,  5.,  9.,  6.,  7.],
                [ 0.,  4.,  0.,  9.,  9.,  5.,  8.,  1.]])]
         --------------
         [array([[ 1.,  6.],
                 [ 6.,  7.],
                 [ 5.,  9.],
                 [ 0.,  3.]]), array([[ 8.,  3.],
                 [ 5.,  1.],
                 [ 7.,  1.],
                 [ 3.,  8.]]), array([[ 2.,  7.],
                 [ 4.,  9.],
                 [ 4.,  4.],
                 [ 0.,  3.]])]

		//矩阵复制
In [46]: a = np.arange(12)
         b = a
         print b is a
         print "--------------"
         b.shape = 3,4
         print a.shape
         print "--------------"
         print id(a)
         print "--------------"
         print id(b)
Out[46]: True
         --------------
         (3, 4)
         --------------
         69083208
         --------------
         69083208

		//矩阵浅复制
In [47]: c = a.view()
         print c is a
         print "--------------"
         print id(c)
         print "--------------"
         print id(a)
         print "--------------"
         c.shape = 2,6
         print c.shape
         print "--------------"
         print a.shape
         print "--------------"
         c[0,4] = 1234
         print a
		 print "--------------"
         print id(c)
         print "--------------"
         print id(a)
Out[47]: False
         --------------
         69084728
         --------------
         69083208
         --------------
         (2, 6)
         --------------
         (3, 4)
         --------------
         [[   0    1    2    3]
          [1234    5    6    7]
          [   8    9   10   11]]
         --------------
         69084768
         --------------
         69083208

		//矩阵深复制
In [48]: d = a.copy()
         print a
         print "--------------"
         print d is a
         print "--------------"
         d[0,0] = 9999
         print d
         print "--------------"
         print id(d)
         print "--------------"
         print id(a)
Out[48]: [[   0    1    2    3]
          [1234    5    6    7]
          [   8    9   10   11]]
         --------------
         False
         --------------
         [[9999    1    2    3]
          [1234    5    6    7]
          [   8    9   10   11]]
         --------------
         69074720
         --------------
         69083208

		//根据索引操作数据
In [49]: data = np.sin(np.arange(20)).reshape(5,4)
         print data
         ind = data.argmax(axis=0)//查找每一列的最大数并返回索引
         print ind
         data_max = data[ind,range(data.shape[1])]//根据索引查找对应的数据
         print data_max
Out[49]: [[ 0.          0.84147098  0.90929743  0.14112001]
          [-0.7568025  -0.95892427 -0.2794155   0.6569866 ]
          [ 0.98935825  0.41211849 -0.54402111 -0.99999021]
          [-0.53657292  0.42016704  0.99060736  0.65028784]
          [-0.28790332 -0.96139749 -0.75098725  0.14987721]]
         --------------
         [2 0 3 1]
         --------------
         [ 0.98935825  0.84147098  0.99060736  0.6569866 ]

		//数组的扩展
In [50]: a = np.arange(0,40,10)
         print a
         print "--------------"
         b = np.tile(a,(2,3))//行扩展为原来的2倍,列扩展为原来的3倍
         print b
         print "--------------"
         b = np.tile(a,(3,2))//行扩展为原来的3倍,列扩展为原来的2倍
         print b
Out[50]: [ 0 10 20 30]
         --------------
         [[ 0 10 20 30  0 10 20 30  0 10 20 30]
          [ 0 10 20 30  0 10 20 30  0 10 20 30]]
         --------------
         [[ 0 10 20 30  0 10 20 30]
          [ 0 10 20 30  0 10 20 30]
          [ 0 10 20 30  0 10 20 30]]

		//数组的排序
In [51]: a = np.array([[4,3,5],[1,2,1]])
         print a
         print "--------------"
         b = np.sort(a,axis=1)//按行排序
         print b
         print "--------------"
         a = np.array([4,3,1,2])
         j = np.argsort(a)//数据排序后的索引
         print j
         print "--------------"
         print a[j]
Out[51]: [[4 3 5]
          [1 2 1]]
         --------------
         [[3 4 5]
          [1 1 2]]
         --------------
         [2 3 1 0]
         --------------
         [1 2 3 4]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值