2 Numpy快速上手

2.1. 什么是Numpy

Numpy是Python的一个科学计算的库

主要提供矩阵运算的功能,而矩阵运算在机器学习领域应用非常广泛

Numpy一般与Scipy、matplotlib一起使用。

虽然python中的list已经提供了类似于矩阵的表示形式,不过numpy为我们提供了更多的函数。

2.1.2 安装导入了Numpy

(通用做法import numpy as np 简单输入)

>>> import numpy as np

>>> print np.version.version

1.6.2

2.1.3 Numpy组成

Numpy基础部分中,有两个主要内容,如下:

任意维数的数组对象(ndarray,n-dimensional array object)

通用函数对象(ufunc,universal function object)

2.2. 多维数组

2.2.1 Numpy中的数组<矩阵>

Numpy中,最重要的数据结构是:多维数组的类型(numpy.ndarray)

ndarray由两部分组成:

实际所持有的数据;

描述这些数据的元数据(metadata)

与Python原生支持的List类型不同,数组的所有元素必须同样的类型。

数组(即矩阵)的维度被称为axes,维数称为 rank

ndarray 的重要属性包括:

² ndarray.ndim:数组的维数,也称为rank

² ndarray.shape:数组各维的大小,对一个n行m列的矩阵来说, shape 为 (n,m)

² ndarray.size:元素的总数。

² ndarray.dtype:每个元素的类型,可以是numpy.int32, numpy.int16, and numpy.float64等

² ndarray.itemsize:每个元素占用的字节数。

² ndarray.data:指向数据内存。

2.2.2 ndarray常用方法示例

2.2.2.2 使用numpy.array方法

以list或tuple变量为参数产生一维数组:

>>> print np.array([1,2,3,4])

[1 2 3 4]

>>> print np.array((1.2,2,3,4))

[ 1.2  2.   3.   4. ]

>>> print type(np.array((1.2,2,3,4)))

<type 'numpy.ndarray'>

以list或tuple变量为元素产生二维数组或者多维数组:

>>> x = np.array(((1,2,3),(4,5,6)))

>>> x

array([[1, 2, 3],

[4, 5, 6]])

>>> y = np.array([[1,2,3],[4,5,6]])

>>> y

array([[1, 2, 3],

[4, 5, 6]])

index 和slicing :第一数值类似数组横坐标,第二个为纵坐标

>>> x[1,2]

6

>>> y=x[:,1]     #取第二列

>>> y

array([2, 5])

涉及改变相关问题,我们改变上面y是否会改变x?这是特别需要关注的!

>>> y[0] = 10

>>> y

array([10,  5])

>>> x

array([[ 1, 10,  3],

[ 4,  5,  6]])

通过上面可以发现改变y会改变x ,因而我们可以推断,y和x指向是同一块内存空间值,系统没有为y 新开辟空间把x值赋值过去。

2.2.2.3 使用numpy.arange方法

>>> print np.arange(15)

[ 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14]

>>> print type(np.arange(15))

<type 'numpy.ndarray'>

>>> print np.arange(15).reshape(3,5)

[[ 0  1  2  3  4]

[ 5  6  7  8  9]

[10 11 12 13 14]]

>>> print type(np.arange(15).reshape(3,5))

<type 'numpy.ndarray'>

2.2.2.4 使用numpy.linspace方法

例如,在从1到10中产生20个数:

>>> print np.linspace(1,10,20)

[  1.           1.47368421   1.94736842   2.42105263   2.89473684

3.36842105   3.84210526   4.31578947   4.78947368   5.26315789

5.73684211   6.21052632   6.68421053   7.15789474   7.63157895

8.10526316   8.57894737   9.05263158   9.52631579  10.        ]

使用numpy.zeros,numpy.ones,numpy.eye等方法可以构造特定的矩阵

构造“0”矩阵:

>>> print np.zeros((3,4))

[[ 0.  0.  0.  0.]

[ 0.  0.  0.  0.]

[ 0.  0.  0.  0.]]

构造“1”矩阵

>>> print np.ones((3,4))

[[ 1.  1.  1.  1.]

[ 1.  1.  1.  1.]

[ 1.  1.  1.  1.]]

构造单位矩阵(E矩阵)

>>> print np.eye(3)

[[ 1.  0.  0.]

[ 0.  1.  0.]

[ 0.  0.  1.]]

2.2.2.5 获取数组的属性:

>>> a = np.zeros((2,2,2))

>>> print a.ndim   #数组的维数

3

>>> print a.shape  #数组每一维的大小

(2, 2, 2)

>>> print a.size   #数组的元素数

8

>>> print a.dtype  #元素类型

float64

>>> print a.itemsize  #每个元素所占的字节数

8

2.2.3 数组的基本运算

数组的算术运算是按元素逐个运算。数组运算后将创建包含运算结果的新数组。

与其他矩阵语言不同,NumPy中的乘法运算符*按元素逐个计算,矩阵乘法可以使用dot函数或创建矩阵对象实现(后续介绍)

2.2.3.1 数组的加减运算

>>> a= np.array([20,30,40,50])

>>> b= np.arange( 4)

>>> b

array([0, 1, 2, 3])

>>> c= a-b

>>> c

array([20, 29, 38, 47])

将运算结果更新原数组,不创建新数组

>>> a= np.ones((2,3), dtype=int)

>>> b= np.random.random((2,3))   ##生成2*3矩阵,元素为[0,1)范围的随机数

>>> a*= 3

>>> a

array([[3, 3, 3],

   [3, 3, 3]])

>>> b+= a   #a转换为浮点类型相加

>>> b

array([[ 3.69092703, 3.8324276, 3.0114541],

    [ 3.18679111, 3.3039349, 3.37600289]])

>>> a+= b   # b转换为整数类型报错

TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int32') with casting rule 'same_kind'

当数组中存储的是不同类型的元素时,数组将使用占用更多位(bit)的数据类型作为其本身的数据类型,也就是偏向更精确的数据类型(这种行为叫做upcast)。

>>> a= np.ones(3, dtype=np.int32)

>>> b= np.linspace(0,np.pi,3)

>>> b.dtype.name

'float64'

>>> c= a+b

>>> c

array([ 1., 2.57079633, 4.14159265])

>>>  'float64'

2.2.3.2 数组乘法运算

>>> b**2

array([0, 1, 4, 9])

>>> 10*np.sin(a)

array([ 9.12945251,-9.88031624, 7.4511316, -2.62374854])

>>> a<35

array([True, True, False, False], dtype=bool)

2.2.3.3 数组内部运算

许多非数组运算,如计算数组所有元素之和,都作为ndarray类的方法来实现,使用时需要用ndarray类的实例来调用这些方法。

二维数组:

>>> np.sum([[0, 1], [0, 5]])

6

>>> np.sum([[0, 1], [0, 5]], axis=0)

array([0, 6])

>>> np.sum([[0, 1], [0, 5]], axis=1)

array([1, 5])

>>> b= np.arange(12).reshape(3,4)

>>> b

array([[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]])

>>> b.sum(axis=0)    # 计算每一列的和

array([12, 15, 18, 21])

>>> b.min(axis=1)    # 获取每一行的最小值

array([0, 4, 8])

>>> b.cumsum(axis=1)   # 计算每一行的累积和

array([[ 0, 1, 3, 6],

[ 4, 9, 15, 22],

[ 8, 17, 27, 38]])

三维数组:

>>> x

array([[[ 0,  1,  2],

[ 3,  4,  5],

[ 6,  7,  8]],

[[ 9, 10, 11],

[12, 13, 14],

[15, 16, 17]],

[[18, 19, 20],

[21, 22, 23],

[24, 25, 26]]])

>>> x.sum(axis=1)

array([[ 9, 12, 15],

[36, 39, 42],

[63, 66, 69]])

>>> x.sum(axis=2)

array([[ 3, 12, 21],

[30, 39, 48],

[57, 66, 75]])

求元素最值

>>> a= np.random.random((2,3))

>>> a

array([[ 0.65806048, 0.58216761, 0.59986935],[ 0.6004008, 0.41965453, 0.71487337]])

>>> a.sum()

   3.5750261436902333

>>> a.min()

0.41965453489104032

>>> a.max()

0.71487337095581649

2.2.3.4 数组的索引、切片

和列表和其它Python序列一样,一维数组可以进行索引、切片和迭代操作。

>>> a= np.arange(10)** 3   #记住,操作符是对数组中逐元素处理的!

>>> a

array([0, 1, 8, 27, 64, 125, 216, 343, 512, 729])

>>> a[2]

8

>>> a[2:5]

array([ 8, 27, 64])

>>> a[:6:2]= -1000 # 等同于a[0:6:2]= -1000,从开始到第6个位置,每隔一个元素将其赋值为-1000

>>> a

array([-1000, 1,-1000, 27,-1000, 125, 216, 343, 512, 729])

>>> a[: :-1] # 反转a

array([ 729, 512, 343, 216, 125,-1000, 27,-1000, 1,-1000])

>>>for i in a:

...    print i**2,

...

1000000 1 1000000 729 1000000 15625 46656 117649 262144 531441

多维数组可以每个轴有一个索引。这些索引由一个逗号分割的元组给出。

>>>def f(x,y):

...    return 10*x+y

...

>>> b= np.fromfunction(f,(5,4),dtype=int)  #fromfunction是一个函数

>>> b

array([[ 0, 1, 2, 3],

[10, 11, 12, 13],

[20, 21, 22, 23],

[30, 31, 32, 33],

[40, 41, 42, 43]])

>>> b[2,3]

23

>>> b[0:5, 1] # 每行的第二个元素

array([ 1, 11, 21, 31, 41])

>>> b[: ,1] # 与前面的效果相同

array([ 1, 11, 21, 31, 41])

>>> b[1:3,: ] # 每列的第二和第三个元素

array([[10, 11, 12, 13],

[20, 21, 22, 23]])

当少于提供的索引数目少于轴数时,已给出的数值按秩的顺序复制,缺失的索引则默认为是整个切片:

>>> b[-1] # 最后一行,等同于b[-1,:],-1是第一个轴,而缺失的认为是:,相当于整个切片。

array([40, 41, 42, 43])

b[i]中括号中的表达式被当作i和一系列":",来代表剩下的轴。NumPy也允许你使用“点”像b[i,...]。

点(…)代表许多产生一个完整的索引元组必要的冒号。如果x是秩为5的数组(即它有5个轴),那么:  

l x[1,2,…] 等同于 x[1,2,:,:,:],

l x[…,3] 等同于 x[:,:,:,:,3]

l x[4,…,5,:] 等同 x[4,:,:,5,:] 

>>> c= array( [ [[ 0, 1, 2],   #三维数组(n个2维数组叠加而成)

...[ 10, 12, 13]],

...

...[[100,101,102],

...[110,112,113]]] )

>>> c.shape

(2, 2, 3)

>>> c[1,...] #等同于c[1,:,:]或c[1]

array([[100, 101, 102],

[110, 112, 113]])

>>> c[...,2] #等同于c[:,:,2]

array([[ 2, 13],

[102, 113]])

2.2.3.5 矩阵的遍历

>>>for row in b:

...    print row

...

[0 1 2 3]

[10 11 12 13]

[20 21 22 23]

[30 31 32 33]

[40 41 42 43]

如果想对数组中每个元素都进行处理,可以使用flat属性,该属性是一个数组元素迭代器:

>>>for element in b.flat:

...    print element,

...

0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43

2.2.3.6 合并数组

使用numpy下的vstack(垂直方向)和hstack(水平方向)函数:

>>> a = np.ones((2,2))

>>> b = np.eye(2)

>>> print np.vstack((a,b))

[[ 1.  1.]

[ 1.  1.]

[ 1.  0.]

[ 0.  1.]]

>>> print np.hstack((a,b))

[[ 1.  1.  1.  0.]

[ 1.  1.  0.  1.]]

看一下这两个函数有没有涉及到浅拷贝这种问题:

>>> c = np.hstack((a,b))

>>> print c

[[ 1.  1.  1.  0.]

[ 1.  1.  0.  1.]]

>>> a[1,1] = 5

>>> b[1,1] = 5

>>> print c

[[ 1.  1.  1.  0.]

[ 1.  1.  0.  1.]]

通过上面可以知道,这里进行是深拷贝,而不是引用指向同一位置的浅拷贝。

2.2.3.7 深度拷贝

数组对象自带了浅拷贝和深拷贝的方法,但是一般用深拷贝多一些:

>>> a = np.ones((2,2))

>>> b = a

>>> b is a

True

>>> c = a.copy()  #深拷贝

>>> c is a

False

2.2.3.8 矩阵转置运算

>>> a = np.array([[1,0],[2,3]])

>>> print a

[[1 0]

[2 3]]

>>> print a.transpose()

[[1 2]

[0 3]]

2.2.4 数组的形状操作

2.4.1 reshape更改数组的形状

数组的形状取决于其每个轴上的元素个数:

>>> a= np.floor(10*np.random.random((3,4)))

>>> a

array([[ 7., 5., 9., 3.],

[ 7., 2., 7., 8.],

[ 6., 8., 3., 2.]])

>>> a.shape

(3, 4)

可以用多种方式修改数组的形状:

>>> a.ravel() # 平坦化数组

array([ 7., 5., 9., 3., 7., 2., 7., 8., 6., 8., 3., 2.])

>>> a.shape= (6, 2)

>>> a.transpose()

array([[ 7., 9., 7., 7., 6., 3.],

[ 5., 3., 2., 8., 8., 2.]])

由ravel()展平的数组元素的顺序通常是“C风格”的,就是以行为基准,最右边的索引变化得最快,所以元素a[0,0]之后是a[0,1]。如果数组改变成其它形状(reshape),数组仍然是“C风格”的。NumPy通常创建一个以这个顺序保存数据的数组,所以ravel()通常不需要创建起调用数组的副本。但如果数组是通过切片其它数组或有不同寻常的选项时,就可能需要创建其副本。还可以同过一些可选参数函数让reshape()和ravel()构建FORTRAN风格的数组,即最左边的索引变化最快。

2.4.2 resize更改数组形状

reshape函数改变调用数组的形状并返回该数组,而resize函数改变调用数组自身。

>>> a

array([[ 7., 5.],

[ 9., 3.],

[ 7., 2.],

[ 7., 8.],

[ 6., 8.],

[ 3., 2.]])

>>> a.resize((2,6))

>>> a

array([[ 7., 5., 9., 3., 7., 2.],

[ 7., 8., 6., 8., 3., 2.]])

##如果调用reshape,则会返回一个新矩阵

>>> a.reshape((2,6))

array([[ 7., 5., 9., 3., 7., 2.],

[ 7., 8., 6., 8., 3., 2.]])

3 数据挖掘与机器学习导论

----机器学习算法最适用的场景就是:不便用规则处理的场合

3.1数据挖掘

简而言之,数据挖掘(Data Mining)是有组织有目的地收集数据,通过分析数据使之成为信息,从而在大量数据中寻找潜在规律以形成规则或知识的技术。

3.2 数据挖掘与机器学习的关系

机器学习可以用来作为数据挖掘的一种工具或手段;

数据挖掘的手段不限于机器学习,譬如还有诸如统计学等众多方法;

但机器学习的应用也远不止数据挖掘,其应用领域非常广泛,譬如人工智能

3.2机器学习

3.2.1定义

机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。目前,世界上共有几百种不同的机器学习算法。

3.2.2机器学习算法类别

分类与聚类

l Classification (分类):

给定一堆样本数据,以及这些数据所属的类别标签,通过算法来对预测新数据的类别

有先验知识

l Clustering(聚类):

事先并不知道一堆数据可以被划分到哪些类,通过算法来发现数据之间的相似性,从而将相似的数据划入相应的类,简单地说就是把相似的东西分到一组

没有先验知识

常见的分类与聚类算法

  • 常用的分类算法:k-最近邻法(k-nearest neighbor,kNN),决策树分类法,朴素贝叶斯分类算法(native Bayesian classifier)、支持向量机(SVM)的分类器,神经网络法,模糊分类法等等。
  • 常见聚类算法: K均值(K-means clustering)聚类算法、K-MEDOIDS算法、CLARANS算法;BIRCH算法、CURE算法、CHAMELEON算法等;基于密度的方法:DBSCAN算法、OPTICS算法、DENCLUE算法等;基于网格的方法:STING算法、CLIQUE算法、WAVE-CLUSTER算法;

监督学习与无监督学习

机器学习按照训练数据是否有“先验知识”,一般划分为三类:

1) 监督学习(supervised learning)

2) 无监督学习(unsupervised learning)

3) 半监督学习(semi-supervised learning)

ü 监督式学习技术需要关于结果的先验知识

例如,如果我们正在研究一个市场活动的历史数据,我们可以根据市场是否产生预期的反应来对数据进行分类,或决定下一步要花多少钱。监督式学习技术为预测和分类提供了强大的工具。

ü 无监督学习技术不需要先验知识。

例如,在某些欺诈的案例中,只有当事情发生很久以后,我们才可能知道某次交易是不是欺诈。在这种情况下,与其试图预测哪些交易是欺诈,我们不如使用机器学习来识别那些可疑的交易,并做出标记,以备后续观察。我们对某种特定的结果缺乏先验知识、但仍希望从数据中汲取有用的洞察时,就要用到无监督式学习。

3.3 机器学习的应用步骤

1) 需求分析

2) 收集数据

3) 探索数据特性

4) 提取数据特征并建模

5) 开发代码(常用语言:R语言,Python语言,spark mllib库)

6) 训练模型

7) 应用系统集成(比如将训练好的算法模型集成到推荐系统中)

通用机器学习算法应用工程技术架构

3.4 机器学习必需数学知识

在数据挖掘所用的机器学习算法中,很大一部分问题都可以归结为以下三个方面的数学知识:概率、距离、线性方程

3.4.1 概率

基本概念:

概率描述的是随机事件发生的可能性

比如,抛一枚硬币,出现正反两面的概率各为50%

基本计算:

设一个黑箱中有8个黑球2个红球,现随机抽取一个球,则

取到黑球的概率为:8/(8+2) =0.8

取到红球的概率:2 /(8+2) =0.2

条件概率:

假如有两个黑箱A/B,A中有7黑球+1红球,B中有1黑球+1红球,假如随机抽取到一个球为红球,问,球来自A箱的概率——这就是条件概率问题

所求概率可表示为: p(A|红球)   即在已知结果是红球的条件下,是来自A的概率

条件概率的计算:

P(A|红球) = P(A,红球)/P(A)

<补充:具体运算过程>

3.4.2 距离(相似度)

在机器学习中,距离通常用来衡量两个样本之间的相似度,当然,在数学上,距离这个概念很丰满,有很多具体的距离度量,最直白的是“欧氏距离”,即几何上的直线距离

v 图示:

如图,在二维平面上有两个点(x1,y1) , (x2,y2),求两点之间的距离

v 计算方法:

D12 =

而在机器学习中,通常涉及的是多维空间中点的距离计算,计算方式一样:

Dn =

3.4.3 线性方程

机器学习中的线性拟合或回归分类问题都需要理解线性方程

v 图示

线性方程用来描述二维空间中的直线或多维空间中的平面,比如在二维空间中,如图

y=ax+b即是图中直线的线性方程:

u x是自变量,y是因变量

u a b 是参数,决定直线的斜率和截距

如果在多维空间中,线性方程则是表示平面,方程形式如:ax+by+cz+d=0

v 计算方法

初等数学经常已知a,  b求解x y,而在高等数学中,我们往往是知道大量的(y,x)样本比如(x1,y1),(x2,y2),(x3,y3)要求反推参数列表(a,b,..)

在维度小,样本数据都“正确+精确”的情况下,可以通过线性方程求解的方式来解出a,b,....

但在机器学习中,我们拿到的大量样本数据本身都是“不精确且充满噪点”的,所以代入方程来求解a,b...显然不可行,此时,一般都是采用逼近的思想来求解:

1) 设定参数的初始值——>代入样本试探——>根据试探结果调整参数——>再次代入样本试探——>再调整参数

2) 一直循环迭代直到获得一组满意的参数

<补充:一个运算实例>

3.4.5 向量和矩阵

在以上3大数学问题中,都涉及到大量样本数据大量特征值的“批量运算”,此时,可运用数学中的工具:“向量和矩阵”

N维向量:就是一个一维的数组(x1,x2,x3,x4,.....),数组中的元素个数即为向量的“维度数”

矩阵:将多个(比如M个) N维向量写在一起,就是矩阵(M*N):

x11,x12,x13,x14,.....

x21,x22,x23,x24,.....

x31,x32,x33,x34,.....

x41,x42,x43,x44,.....

矩阵和向量的意义主要在哪呢?就是为了方便快速地进行大量数据(尤其是线性方程问题)的批量运算

如:

矩阵相加

矩阵相乘

-------------------------------------------------------------------------------------------------------

day39机器学习的更多相关文章

  1. 100天搞定机器学习|day39 Tensorflow Keras手写数字识别

    提示:建议先看day36-38的内容 TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edge ...

  2. 100天搞定机器学习|day40-42 Tensorflow Keras识别猫狗

    100天搞定机器学习|1-38天 100天搞定机器学习|day39 Tensorflow Keras手写数字识别 前文我们用keras的Sequential 模型实现mnist手写数字识别,准确率0. ...

  3. .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍

    Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...

  4. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  5. 借助亚马逊S3和RapidMiner将机器学习应用到文本挖掘

    本挖掘典型地运用了机器学习技术,例如聚类,分类,关联规则,和预测建模.这些技术揭示潜在内容中的意义和关系.文本发掘应用于诸如竞争情报,生命科学,客户呼声,媒体和出版,法律和税收,法律实施,情感分析和趋 ...

  6. Android开发学习之路-机器学习库(图像识别)、百度翻译

    对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...

  7. 【NLP】基于机器学习角度谈谈CRF(三)

    基于机器学习角度谈谈CRF 作者:白宁超 2016年8月3日08:39:14 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都 ...

  8. 机器学习实战笔记(Python实现)-08-线性回归

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  9. 机器学习实战笔记(Python实现)-06-AdaBoost

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

随机推荐

  1. UIScrollview的 约束 contentsize contentoffset contentinset layoutsubviews needlayout等影响布局的属性

    很久没有写视图布局,最近发现写布局很不顺手,总结一下在处理UIScrollview的时候种种注意事项: 1. self.automaticallyAdjustsScrollViewInsets = N ...

  2. [leetcode121]股票买卖 Best Time to Buy and Sell Kadane算法

    [题目] Say you have an array for which the ith element is the price of a given stock on day i. If you ...

  3. L1-054 福到了

    “福”字倒着贴,寓意“福到”.不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出.这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格.而倒过来的汉 ...

  4. Java基础-流程控制语句与运算符

    运算符 算术运算符 ++ -- 在前时先运算后取值:在后时先取值后运算 关系运算符 == !=也可以是引用类型 位运算符 逻辑运算符 赋值运算符 条件运算符 (?:) 布尔表达式 ? 表达式1 : 表 ...

  5. 手打struts知识点

    Struts2概论 1.MVC原理 MVC(Model-View-Controller),程序设计理念 视图不用多说,html.jsp等 控制器,中转站,分配各个组件应当做什么,接受参数并跳转其他处理 ...

  6. Activity中通过标签获取当前Fragment

    初始化完成之后才有数据,否则获取不到 String tag = "android:switcher:"+viewPager.getId()+":"+viewPa ...

  7. format格式

    The format part is where you can specify more precisely the format of the data that you expect. For ...

  8. POJ 2407 Relatives(欧拉函数入门题)

    Relatives Given n, a positive integer, how many positive integers less than n are relatively prime t ...

  9. Python 的基本运算及分析

    1题   输出1 2 3 4 5 6  8 9 10 . 方法一: count = 0while count < 10 : count += 1 if count == 7 : continue ...

  10. shell连接ubuntu流程

    {ubuntu}下载 sudo apt-get install tasksel     {选择安装SSH server服务)[有些ubuntu默认是安装好ssh的,只是没有配置,和开启ssh服务] s ...