ML实战Python知识点总结(一)

一、数组和矩阵

注意,两者看似差不多,但是在对它们进行一系列操作时,效果会不太一样

数组:

1
2
3
4
5
6
>>> a = array([[1,1],[1,2],[1,3],[1,4]])
>>> a
array([[1, 1],
[1, 2],
[1, 3],
[1, 4]])

矩阵:

1
2
3
4
5
6
>>> b = mat(a)
>>> b
matrix([[1, 1],
[1, 2],
[1, 3],
[1, 4]])

二、numpy–函数shape用法

对数组和对矩阵的操作有一定的区别:

相同点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> a
array([[1, 1],
[1, 2],
[1, 3],
[1, 4]])
>>> b = mat(a)
>>> b
matrix([[1, 1],
[1, 2],
[1, 3],
[1, 4]])
>>> a.shape
(4, 2)
>>> b.shape
(4, 2)

不同点:

1
2
3
4
5
6
>>> c = array([1,2,3,4])
>>> c.shape
(4,)
>>> d = mat(c)
>>> d.shape
(1, 4)

shape[0]表示数组、矩阵的行数;shape[1]表示数组、矩阵的列数;这里通过c、d的操作可以发现,shape主要是针对矩阵的,操作数组时可能会出错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> a.shape[0]
4
>>> b.shape[1]
2
>>> c.shape[0]
4
>>> c.shape[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
>>> d.shape[0]
1
>>> d.shape[1]
4

三、numpy–函数tile用法

其主要功能是对数组进行复制,tile(a,(row,column)),表示将数组a复制成一个row行,column列的数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> a = [1,2,3]
>>> b = tile(a,2)
>>> b
array([1, 2, 3, 1, 2, 3])
>>> b = tile(a,(2,1))
>>> b
array([[1, 2, 3],
[1, 2, 3]])
>>> b = tile(a,(1,2))
>>> b
array([[1, 2, 3, 1, 2, 3]])
>>> b = tile(a,(2,2))
>>> b
array([[1, 2, 3, 1, 2, 3],
[1, 2, 3, 1, 2, 3]])

四、numpy–函数sum用法

注意,numpy里的sum和python自身的sum是不太一样的,这里主要介绍numpy里的sum:

axis=0表示列相加,axis=1表示行相加,没有则全部相加

使用方式1:

1
2
3
4
5
6
7
>>> from numpy import *
>>> sum([[0,1,2],[1,2,3]],axis=1)
array([3, 6])
>>> sum([[0,1,2],[1,2,3]],axis=0)
array([1, 3, 5])
>>> sum([[0,1,2],[1,2,3]])
9

使用方式2:

1
2
3
4
5
6
7
8
9
>>> b
array([[1, 2, 3],
[1, 2, 3]])
>>> b.sum()
12
>>> b.sum(axis=0)
array([2, 4, 6])
>>> b.sum(axis=1)
array([6, 6])

五、numpy–函数argsort用法

其返回的是数组值从小到大的索引值

Examples

One dimensional array:一维数组

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

Two-dimensional array:二维数组

1
2
3
4
5
6
7
8
9
10
>>> x = np.array([[0, 3], [2, 2]])
>>> x
array([[0, 3],
[2, 2]])
>>> np.argsort(x, axis=0) #按列排序
array([[0, 1],
[1, 0]])
>>> np.argsort(x, axis=1) #按行排序
array([[0, 1],
[0, 1]])

例1:

1
2
3
4
5
6
7
8
9
10
>>> x = np.array([3, 1, 2])
>>> np.argsort(x) #按升序排列
array([1, 2, 0])
>>> np.argsort(-x) #按降序排列
array([0, 2, 1])

>>> x[np.argsort(x)] #通过索引值排序后的数组
array([1, 2, 3])
>>> x[np.argsort(-x)]
array([3, 2, 1])

另一种方式实现按降序排序:

1
2
3
4
5
>>> a = x[np.argsort(x)]
>>> a
array([1, 2, 3])
>>> a[::-1]
array([3, 2, 1])

六、python字典的get函数和iteritems函数

1.get():

get()方法语法:\
dict.get(key, default=None)\
key – 字典中要查找的键。\
default – 如果指定键的值不存在时,返回该默认值。

如:

1
2
>>> dict.get('d','error')  
'error'

2.iteritems():

python字典中还存在 items() 方法。两者有些许区别。\
items方法是可以将字典中的所有项,以列表方式返回。\
iteritems方法与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器。

1
2
3
4
5
6
7
8
9
10
11
>>> d = {'1':'one', '2':'two', '3':'three'}  
>>> x = d.items()
>>> x
[('1', 'one'), ('3', 'three'), ('2', 'two')]
>>> type(x)
<type 'list'>
>>> y = d.iteritems()
>>> y
<dictionary-itemiterator object at 0x025008A0>
>>> type(y)
<type 'dictionary-itemiterator'>

七、operator.itemgetter函数

operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号。

要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。

如:

1
2
3
4
5
6
7
8
9
10
11
>>> import operator
>>> a = [1,2,3]
>>> b = operator.itemgetter(0,1)
>>> b(a)
(1, 2)
>>> b = operator.itemgetter(2,0)
>>> b(a)
(3, 1)
>>> b = operator.itemgetter(2,0,1)
>>> b(a)
(3, 1, 2)

八、sorted函数

sorted函数用来排序,sorted(iterable[, cmp[, key[, reverse]]])

参数:
iterable可以是list或者iterator;
cmp是带两个参数的比较函数,这个在python3里已经被弃用,可以不考虑。
key 是带一个参数的函数;
reverse为False或者True;

其中key的参数为一个函数或者lambda函数。所以itemgetter可以用来当key的参数。



根据第二个域和第三个域进行排序:

1
2
3
>>> a = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(a, key=operator.itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

Git常用命令

常用命令:

1.git clone url//将url上的项目克隆到本地

2.git init //通过git init命令把这个目录变成Git可以管理的仓库

3.git status//检测当前的状态

4.git add 文件名//建立跟踪

5.git status//再次检测当前状态(可以使用git reset 文件名,使得刚刚执行的git add 文件名 撤销)

6.$ git commit -m “add distributed”//表示确认提交,提交的过程中,-m后面写提交说明,如果没-m,那么会vim自动打开,会让你输入提交的说明(和github中提交前填写的说明是一个意思)。

7.git diff //看具体修改了什么内容(具体代码修改的是哪部分)

帮助理解:

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

Read More

JavaScript中的字符串拼接

这是JavaScript DOM编程艺术中的一个例子,字符串拼接部分曾经迷惑了我很久,各大网站上也没发现很好的讲解,下面最终查资料得到的结论…

首先看代码:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p id="message">these are the things you should konw</p>
<script type="text/javascript">
// 设定message的原始位置
function positionMessage() {
if (!document.getElementById) return false;
if (!document.getElementById('message')) return false;
var elem = document.getElementById('message');
elem.style.position = "absolute";
elem.style.left = "50px";
elem.style.top = "100px";
// movement = setTimeout("moveMessage()",3000);
moveElement("message",1000,1000,10);
}

// 移动元素位置函数
// function moveMessage(){
// if (!document.getElementById) return false;
// if (!document.getElementById('message')) return false;
// var elem = document.getElementById('message');
// var xpos = parseInt(elem.style.left);
// var ypos = parseInt(elem.style.top);
// if (xpos == 2000 && ypos == 1000) {
// return true;
// }
// if (xpos < 2000) {
// xpos++;
// }
// if (xpos > 2000) {
// xpos--;
// }
// if (ypos < 1000) {
// ypos++;
// }
// if (ypos >1000) {
// ypos--;
// }
// elem.style.left = xpos + "px";
// elem.style.top = ypos + "px";
// movement = setTimeout("moveMessage()",10);
// }

// 抽象
function moveElement(elementID,final_x,final_y,interval){
if (!document.getElementById) return false;
if (!document.getElementById(elementID)) return false;
var elem = document.getElementById(elementID);
var xpos = parseInt(elem.style.left);
var ypos = parseInt(elem.style.top);
if (xpos == final_x && ypos == final_y) {
return true;
}
if (xpos < final_x) {
xpos++;
}
if (xpos > final_x) {
xpos--;
}
if (ypos < final_y) {
ypos++;
}
if (ypos >final_y) {
ypos--;
}
elem.style.left = xpos + "px";
elem.style.top = ypos + "px";
var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";
movement = setTimeout(repeat,interval);
}
// 加载函数的函数
function addLoadEvent(func){
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
}
else{
window.onload = function(){
oldonload();
func();
}
}
}
// 加载函数
addLoadEvent(positionMessage);
</script>
</body>
</html>

Read More

关于NodeJS中类似函数参数arguments的问题

小文件拷贝中:

1
2
3
4
5
6
7
8
9
10
11
var fs = require('fs');

function copy(src,dst){
fs.writeFileSync(dst, fs.readFileSync(src));
}

function main(argv){
copy(argv[0],argv[1]);,
}

main(process.argv.slice(2));

困惑的是:main(argv)怎么就可以传入两个参数,并且调用的时候,可以使用==argv[0],argv[1]==?我们都知道:在js参数个数是可以传任意多个,不管命名的参数有多少个。但是在调用的时候必须使用==arguments[0],arguments[1]…==这种形式来调用参数。这里之所以可以直接使用argv,是因为使用==process.argv==获得命令行参数!

一个超级简单的sql注入演示

(一)了解注入原理

为什么会存在sql注入呢,只能说SQL出身不好。因为sql作为一种解释型语言,在运行时是由一个运行时组件解释语言代码并执行其中包含的指令的语言。基于这种执行方式,产生了一系列叫做代码注入(code injection)的漏洞 。它的数据其实是由程序员编写的代码和用户提交的数据共同组成的。程序员在web开发时,没有过滤敏感字符,绑定变量,导致攻击者可以通过sql灵活多变的语法,构造精心巧妙的语句,不择手段,达成目的,或者通过系统报错,返回对自己有用的信息。
我们在学JDBC和SQL时,讲师跟我们说 Statement不能防止SQL注入, PreparedStatement能够防止SQL注入. 没错, 这句话是没有问题的, 但到底如何进行SQL注入?怎么直观的去了解SQL注入?这还是需要花一定的时间去实验的.预编译语句java.sql.PreparedStatement ,扩展自 Statement,不但具有 Statement 的所有能力而且具有更强大的功能。不同的是,PreparedStatement 是在创建语句对象的同时给出要执行的sql语句。这样,sql语句就会被系统进行预编译,执行的速度会有所增加,尤其是在执行大语句的时候,效果更加理想。而且PreparedStatement中绑定的sql语句是可以带参数的。

(二)架设注入环境

我们知道现在php作为一门网页编程语言真是风生水起,利用lamp(linux+apache+mysql+php)或者wamp(windows+apache+mysql+php)搭建网站环境,如腾讯的discuz、阿里的 phpwind 以及织梦的dedecms 等建站程序,占据了国内网站的半壁江山。那么我们今天即以这种架构为假象敌,首先是在本地架设wamp环境。需要用到的工具有:apache,mysql,php ,这几个组件可以单独下载安装,不过安装配置过程较为繁琐,还是建议新手直接从网上下载phpnow ,一个绿色程序,包含上述三个组件,傻瓜化操作就可以了。
然后呢,我们要建立测试用的数据表,编写html,php,文件,通过实例具体来演示通过SQL注入,登入后台管理员界面。这里,我之前已经写好了,大家看下:

1.创建一张试验用的数据表:

1
2
3
4
5
6
7
CREATE TABLE users (
  id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(64) NOT NULL,
  password varchar(64) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY username (username)
  );

Read More

深度理解函数:addLoadEvent(func){}

首先:

注释如下,应该可以理解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

function addLoadEvent(func){

var oldonload = window.onload;

if (typeof window.onload != 'function') {//判断当前如果没有函数加载

window.onload = func;//那么直接加载传入的函数

}

else{//如果在调用addLoadEvent前,有window.onload加载的函数,那么加上该函数

window.onload = function(){

oldonload();

func();

}

}

}
测试:
Read More