域名更换通知

各位小伙伴,由于原有域名续费过于麻烦,所以www.dear-shen.com这个域名弃用,本人博客唯一网址就只有www.hi-roy.com

评论和分享

numpy学习笔记

发布在 Python

简介

Numpy(发音”南派”而不是”努屁”)是一款用来进行科学计算的python库,可以方便快速的计算平均值、最大值、最小值、方差、标准差、向量运行等。相关库还有
Pandas,Scypi等。

数组

Numpy中用数组来表示数据,和Python中的列表相比,除了提供了一些更快、更方便的函数外,最大的区别就在于前者同一数组内的元素类型必须一致,而后者则无此要求。

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
In [1]: import numpy as np
In [2]: np.array([1,2,3,4,5]) # 创建一个numpy数组
Out[2]: array([1, 2, 3, 4, 5])
In [3]: np.array([1,2,3,4,5]).dtype # 查看元素类型
Out[3]: dtype('int64')
In [4]: np.max([1,2,3,4,5]) # 最大值
Out[4]: 5
In [5]: np.min([1,2,3,4,5]) # 最小值
Out[5]: 1
In [6]: np.std([1,2,3,4,5]) # 标准差
Out[6]: 1.4142135623730951
In [7]: np.mean([1,2,3,4,5]) # 平均值
Out[7]: 3.0
In [8]: np.array([1,2,1.2,4,'a']) # 声明时候就不按套路出牌,可以发现最后都变成了字符串
Out[8]:
array(['1', '2', '1.2', '4', 'a'],
dtype='|S32')
In [9]: a = np.array([[1,2],[3,4]]) # 定义二维数组
In [10]: a[:,1] # 取第2列
Out[10]: array([2, 4])
In [11]: a[1,:] # 取第2行
Out[11]: array([3, 4])
In [12]: a[1,1] # 取某个值
Out[12]: 4
In [13]: a[1,1:] # 使用切片
Out[13]: array([4])

运算

Numpy中的运算都是向量运算,支持加、减、乘、除、指数运算以及与、或、非这类逻辑运算,

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
In [35]: a=np.array([5,3,1])
In [36]: b=np.array([2,4,6])
In [37]: a+b
Out[37]: array([7, 7, 7])
In [38]: a-b
Out[38]: array([ 3, -1, -5])
In [39]: a*b
Out[39]: array([10, 12, 6])
In [40]: a/b
Out[40]: array([2, 0, 0])
In [41]: a**b
Out[41]: array([25, 81, 1])
In [42]: a&b
Out[42]: array([0, 0, 0])
In [43]: a|b
Out[43]: array([7, 7, 7])
In [44]: ~a
Out[44]: array([-6, -4, -2])

这里注意py2版本的除法默认是取结果整数部分的,另外需要注意Numpy中++=有些区别,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
In [67]: a = np.array([2,3,4])
In [68]: b = a
In [69]: a += 1
In [70]: b
Out[70]: array([3, 4, 5])
In [71]: a
Out[71]: array([3, 4, 5])
In [72]: a = a + 1
In [73]: a
Out[73]: array([4, 5, 6])
In [74]: b
Out[74]: array([3, 4, 5])

可以看出,对于+=操作是修改了数组本身的值,而+操作则是创建了一个新的数组赋值给了变量a。
+=操作的行为叫做原位运算(In-Place),+操作则是非原位运算(Not In-Place)。对于切片操作,Numpy的行为和Python不同:

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
In [75]: a
Out[75]: array([4, 5, 6])
In [76]: e = [1,2,3]
In [77]: f = e[:2]
In [78]: f
Out[78]: [1, 2]
In [79]: f[0]= 9
In [80]: f
Out[80]: [9, 2]
In [81]: e
Out[81]: [1, 2, 3]
In [82]: a
Out[82]: array([4, 5, 6])
In [83]: g = a[:2]
In [84]: g
Out[84]: array([4, 5])
In [85]: g[0] = 8
In [86]: g
Out[86]: array([8, 5])
In [87]: a
Out[87]: array([8, 5, 6])

Python中切片操作创建了一个新的列表出来,改变新的列表值不会影响旧列表。而Numpy中的切片还是指向原来的值,会互相影响。

索引数组

假设有2个数组的 长度一样,一个数组类型为整型,另一个数组的类型为布尔型,则

1
2
3
4
5
6
7
8
9
10
11
12
13
In [45]: a
Out[45]: array([5, 3, 1])
In [46]: c = np.array([True,False,True])
In [47]: a[c]
Out[47]: array([5, 1])
In [48]: a[a!=3]
Out[48]: array([5, 1])
In [49]: a != 3
Out[49]: array([ True, False, True], dtype=bool)

数组c为索引数组(index array),除此之外可以直接在数组索引中使用逻辑判断达到同样的效果。也就是说,对一个数组进行逻辑判断后
返回的结果是一个索引数组。

当使用Numpy处理二维数组时候,就会涉及到轴(axis)这个概念,轴用来控制行或者列的平均值、最大最小值、标准差等的计算:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [3]: a = np.array([[1,2],[3,4]])
In [4]: a
Out[4]:
array([[1, 2],
[3, 4]])
In [5]: a.mean()
Out[5]: 2.5
In [6]: a.mean(axis=0)
Out[6]: array([ 2., 3.])
In [7]: a.mean(axis=1)
Out[7]: array([ 1.5, 3.5])

这里声明了一个二维数组,当mean函数不添加任何参数时,默认计算了整个数据的平均值。当axis=0时则计算出每一列的平均值,axis=1时则计算每一行的平均值。
其他计算函数同理。

标准化

用于将数据进行标准化(standardized)处理,即(单值-平均数)/标准差,为啥要进行标准化处理呢?我觉得是为了减少两组变量之间由于取值区间差异过大而产生的问题。
比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
In [60]: a
Out[60]: array([ 1, 3, 5, 7, 9, 11])
In [61]: b
Out[61]: array([5000, 4000, 3000, 2000, 1000, 50])
In [63]: a_s = (a-a.mean())/a.std()
In [64]: b_s = (b-b.mean())/b.std()
In [69]: a_s
Out[69]:
array([-1.46385011, -0.87831007, -0.29277002, 0.29277002, 0.87831007,
1.46385011])
In [70]: b_s
Out[70]:
array([ 1.4694161 , 0.87968389, 0.28995167, -0.29978054, -0.88951276,
-1.44975836])

可以看出,在进行标准化后a和b的取值区间差异变得很小了。

相关系数

使用皮尔逊积矩相关系数来计算2个变量的相关度,这里需要注意的是2个变量之间需要有线性关系,变量是连续变量,变量符合正态分布。

计算皮尔逊相关系数可以分为2步:

  1. 将数据标准化
  2. 标准化的数据进行乘法运算,并取结果的平均值
1
2
3
4
def correlation(x, y):
tempx = (x-x.mean()) / x.std()
tempy = (y-y.mean()) / y.std()
return (tempx * tempy).mean()

另外Numpy中已经提供了函数corrcoef可以直接使用:

1
2
3
4
5
6
7
In [68]: correlation(a_s,b_s)
Out[68]: -0.99996549701548165
In [65]: np.corrcoef(a_s,b_s)
Out[65]:
array([[ 1. , -0.9999655],
[-0.9999655, 1. ]])

可以看出和自己编写的函数结果是一样的。

评论和分享

关于JWT(Json Web Token)是一种较新的用户认证方式,官网在这里,网上有篇中文解释写的很好,点此跳转

用户认证(Authentication)和用户授权(Authorization)是两个不同的概念,认证解决的是“有没有”的问题,而授权解决的是“能不能”的问题。

一般用到JWT认证的情况大多都是配合REST框架使用,比如我大Django的Django-REST-framework框架,就已经有了现成的三方库django-rest-framework-jwt。不过这个库默认只支持基于Header传递信息,所以改成基于Cookie方式还需要我们来手动处理一下。

阅读全文

作为一个前端渣渣,最近在写js代码的时候,开始使用一些ES6的新特性,结果到箭头函数部分“掉坑”了。网上大部分都说箭头函数怎么用,而很少说箭头什么时候 不要用,所以这里翻译一篇文章来说说什么时候不要用的问题。

原文地址,向原作者表示感谢。

阅读全文

最近一直在思考如何更好的组织Django中的静态资源,比如JS、CSS一类,如何结合前端构建工具写出更好的代码以及结构呢?

首先需要解决的一个问题就是某些时候需要把JS代码写在模板里来获取后台传递过来的变量,比如:

1
2
3
4
5
6
7
8
9
<div>
<h1>Test</h1>
<div id="my-test" ></div>
</div>
<script>
$(function(){
$('#my-test').html("{{ some_var_from_view }}")
});
</script>

这么写代码的话,别扭不说,前端的那些构建工具比如webpack,gulp的使用范围也将大大降低。

首先说结论,想完全剥离JS和模板而又需要使用模板渲染的数据,我是没想到什么好办法。如果读者有好办法希望赐教。
既然不能完全剥离,那么就进最大的努力分离JS所需的数据和代码吧。

阅读全文

原文地址,向原作者表示感谢。由于本人并没学习过angular,所以翻译有误的地方恳请指正。


我已经受够了JS社区的那帮二货,我只是想使用Django作为后端结合Angular做一个简单的、可复用的项目,却没有一个简明的指导教我如何做到。如果你也为此挣扎,这里有一份指南教你如何构建一个由Django作为后端、Webpack进行组织的Angular程序。

问题

我想开发一个Angular1.1.x的项目并使用Django作为后端提供数据,我喜欢使用Django REST Framework(DRF)来构造RESTful API。我也想打包需要的JavaScript资源。目前,我打算使用单一的服务器上运行这个程序。

依赖

  • Python 2.x
  • a virtual Python environment
  • Django 1.9.x (pip install django)
  • npm 2.15.8+
  • Webpack 1.13.x (sudo npm i -g webpack)
  • ESLint 2.13.1+ (sudo npm i -g eslint)
  • NodeJS 4.4.7+
阅读全文

有些时候我们会有这种需求:用户上传一个格式固定excel表格到网站上,然后程序负债解析内容并进行处理。
举一个简单的栗子,比如我们有这样一个HTML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<p>上传EXCEL表格</p>
<form class="" action="" method="post" enctype="multipart/form-data" >
{% csrf_token %}
<input type="file" name="excel">
<input type="submit" value="上传">
</form>
</body>
</html>

forms.py文件内容如下,编写一个简单的判断后缀的验证:

1
2
3
4
5
6
7
8
9
10
11
12
# coding=utf-8
from django import forms
from django.utils.translation import gettext as _
from django.core.exceptions import ValidationError
def validate_excel(value):
if value.name.split('.')[-1] not in ['xls','xlsx']:
raise ValidationError(_('Invalid File Type: %(value)s'),params={'value': value},)
class UploadExcelForm(forms.Form):
excel = forms.FileField(validators=[validate_excel]) #这里使用自定义的验证

处理excel表格我这里使用xlrd库,使用pip安装即可。此时处理POST请求时有2种方法:

  1. 将用户上传的excel存储到磁盘中再读取交给xlrd处理。
  2. 直接在内存中读取用户上传的excel读取交给xlrd处理。

这里我使用第二个办法——在不修改django默认settings.py配置情况下,用户上传的文件其实是InMemoryUploadedFile类型,这个类型有一个read()方法,所以views.py中可以内存直接读取内容而不用写磁盘再读取了:

1
2
3
4
5
6
7
8
9
10
11
def post(self, request, *args, **kwargs):
form = UploadExcelForm(request.POST, request.FILES)
if form.is_valid():
wb = xlrd.open_workbook(
filename=None, file_contents=request.FILES['excel'].read()) # 关键点在于这里
table = wb.sheets()[0]
row = table.nrows
for i in xrange(1, row):
col = table.row_values(i)
print col
return HttpResponse("ok")

其他文件类型同理,如果不需要保存用户上传的文件到硬盘其实都可以这么处理。这里记录2个和django处理excel有关的资源:

  1. django-excel 判断用户excel格式的三方库
  2. https://assist-software.net/blog/how-export-excel-files-python-django-application 讲解如何导出excel的文章

评论和分享

使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传图片来说,简单的几行代码即可:

1
2
3
4
5
6
7
8
9
import requests
files = {'attachment_file': ('1.png', open('1.png', 'rb'), 'image/png', {})}
values = {'next':"http://www.xxxx.com/xxxx"}
r = requests.post('http://www.xxxx.com/upload', files=files, data=values) # 成功
r = requests.post('http://www.xxxx.com/upload', files=files, data=values) # 失败
r = requests.post('http://www.xxxx.com/upload', files=files, data=values) # 失败
r = requests.post('http://www.xxxx.com/upload', files=files, data=values) # 失败
r = requests.post('http://www.xxxx.com/upload', files=files, data=values) # 失败
...

不过我今天在调试一个django程序的时候却遇到了大坑————为了偷懒,我直接在ipython中执行了上述代码,第一次提交的时候一切正常,但第二次之后提交就怎么也通过不了django的form验证。

阅读全文

GPG使用记录

发布在 Linux

GPG简单来说是一种加密机制,可以用来加密文件、邮件等。这里以Centos为例记录一下生成密钥以及相关操作。

阅读全文

Roy.S

微信公众号:hi-roy


野生程序员


China