Posts Tagged ‘Python’
-
NumPy学习笔记(二)
ndarray的几个常用属性:
- shape: 代表一个array的形态,是一个向量还是一个矩阵,抑或是一个更复杂的向量组。
- ndim: 代表这个array的维度
- size: 在array中拥有的元素数量
- itemsize: 这个array中每一个元素所需要占的字节数
- nbytes: 这个array的总字节数(=itemsize*size)
- real: 代表一个array中所有元素的实数部分
- imag: 同理,代表一个array中所有元素的虚数部分
- flat: 将这个array整理成一维的,可以索引的一系列的元素组合。它实际上是通过iterator实现的,我们可以通过for x in array.flat来取得到所有的元素
- T: 矩阵转置,同transpose()方法
一些比较有用的方法:
- tolist(): 将array转化成一个Python中的list对象
- item(*args): 取得某一位置的元素
- dump(file): 将这个对象序列化至文件。同cPickle中的dump作用
- dumps(): 将序列化的结果通过字符串加以输出
一些关于Array的形态操作:
- reshape(): 改变array的形态
- resize(): 也是改变array的形态。不同的是,resize是直接修改这个对象的,而reshape则会生成一个新的对象
- transpose(): 这个就是矩阵的转置操作啦
- swapaxes(): 将n个维度中任意两个维度(坐标轴)进行调换
- flatten(): 复制一个一维的array出来
还有一些关于Array的运算操作:
- max():取得所有元素中的最大值
- min():取得最小值。还有一点值得说,就是max、min这些函数都可以针对某一坐标轴(具体维度)进行运算,例如array.max(axis=0),就在0坐标上求最大值
- sum():求和
- cumsum():求累计和
- prod():求所有元素之积
- cumprod():求累计积
- all():如果所有元素都为真,那么返回真;否则返回假
- any():只要有一个元素为真则返回真
- mean():求平均数
总结了一部分,更多的方法还需要我们使用中体验。
-
Python Challenge Level 6
感觉变态程度越来越高了……
入口地址:http://www.pythonchallenge.com/pc/def/channel.html
进去之后,一支巨大的拉链映入眼帘。根据以往经验,查看源代码。分析了一下,只有一个内容有用:
<!-- <-- zip -->
根据那个拉链,再根据这个zip,看起来这道题跟zip关系十分之大。关键问题是怎么利用zip呢?百思不得其解。后来经过若干尝试,终于发现了原来隐藏的内容在channel.zip中。下载了这个文件,发现了一堆文件,里面又是指向下一个文件名的编号。和前几次中urllib的那回有异曲同工之处。打开readme文件:
welcome to my zipped list.
hint1: start from 90052
hint2: answer is inside the zip给了初始值,也给了暗示,答案在zip文件中。。按照当时写urllib的样子,写了这个循环的程序。
这里用到了python中的zip处理模块:zipfile。调用一个zip文件,可以通过zipfile.ZipFile()来打开;然后可以使用namelist()取得到所有zip文件中的文件名。infolist()可以得到关于zip的一些信息,另外通过read/write函数,可以读取、写入zip文件中的内容。
import re
import zipfilevalue,n = 90052,1
print “initial value: %s” % valuef = zipfile.ZipFile(“channel.zip”)
while(True):
try:content=f.read(“%s.txt” % value)
print content
value=re.search(r’(\d+)$’, content, re.IGNORECASE).group()
print “the next value: %s, this is the %d time” % (value,n)
n+=1
except:
break
给出来的结果:
initial value: 90052
Next nothing is 94191the next value: 94191, this is the 1 time
Next nothing is 85503
the next value: 85503, this is the 2 time
Next nothing is 70877
the next value: 70877, this is the 3 time
……
Next nothing is 8700
the next value: 8700, this is the 904 timeNext nothing is 45100
the next value: 45100, this is the 905 time
Next nothing is 68628
the next value: 68628, this is the 906 time
Next nothing is 67824
the next value: 67824, this is the 907 time
Next nothing is 46145
the next value: 46145, this is the 908 time
Collect the comments.
最后让我们收集comments。可是并没有发现zip文件里面有comments啊,这个是个大问题。搜索了一下,发现关于Zip文件操作的有zipfile和zipinfo两个类。而zipinfo下面有个comment,可能就是它吧。那怎么得到zipinfo的对象呢?zipfile里面有getinfo()和infolist()两个函数可以得到。经实验后得解。
最后得到了一个有点变态的list,看图:
又有点像是一个字符拼成的图像。不过不像上一道题,是由空格和*号组成的。这个里面什么都有。另外还是list类型,每个节点只存储了一个字符,干脆给连起来。然后就得到了结果。
hockey.html是出口?不是。。“it’s in the air. look at the letters. ”放大了,可以看到上面由字母组成的单词了,不是hockey,而是:oxygen。
我的代码:
import re
import zipfileimport string
value,n,comments = 90052,1,[]
#print “initial value: %s” % valuef = zipfile.ZipFile(“channel.zip”)
while(True):
try:content=f.read(“%s.txt” % value)
# print content
comments.append(f.getinfo(“%s.txt” % value).comment)
value=re.search(r’(\d+)$’, content, re.IGNORECASE).group()
# print “the next value: %s, this is the %d time” % (value,n)
n+=1
except:
break
#print comments
print string.join(comments)
下一级入口:oxygen.html
-
NumPy学习笔记(一)
最近在学习scipy。在理解scipy之前,numpy作为scipy基本的模块之一,是不得不去理解掌握的。先总结一下numpy部分的内容吧。接下来学习scipy,最后是pylab和Matplotlib。
介绍
Numpy是一个Python的扩展模块,通过使用NumPy,我们可以进行科学计算。NumPy提供了矩阵、线性代数、傅里叶变换等的解决方法。
NumPy包含:
- N维矩阵对象
- 线性代数运算功能
- 傅里叶变换
- Fortran代码集成的工具
- C++代码集成的工具
NumPy提供了两种基本的对象:ndarray(N-dimensional array object)和 ufunc(universal function object)。前者为一个n维的矩阵在Python中的存储对象,它是一类同类型的对象(如int、bool、unicode、str等等)的集合。
下载
为了使用NumPy,首先要有Python。然后下载NumPy的包,即可。
- Python 2.5: http://www.python.org/download/releases/2.5.2/
- NumPy: http://numpy.scipy.org/
使用
安装好后,首先引入模块:
»> from numpy import *
创建一个矩阵
»> a=array([[1,2,3],[4,5,6]])
»> a.shape
(2, 3)»> b=arange(15);print b
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
»> b.reshape(3,5)
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])可以看到,A是2行3列的矩阵。通过arange方法,可以得到一个1维的数组。然后我们可以通过reshape方法改变它的维度。
»> c=zeros((4,5));print c
[[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]]»> d=ones((5,7));print d
[[ 1. 1. 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 1. 1. 1.]]»> e=add(c,arange(20).reshape(4,5))
»> f=dot(e,d);print f
[[ 10. 10. 10. 10. 10. 10. 10.]
[ 35. 35. 35. 35. 35. 35. 35.]
[ 60. 60. 60. 60. 60. 60. 60.]
[ 85. 85. 85. 85. 85. 85. 85.]]使用zeros可以生成一个零矩阵。同理,用ones可以生成值全部为1的矩阵。我选择了一个4*5的矩阵e,和一个5*7的矩阵d做点乘。最后得到f矩阵。再举一个更加明显的例子:
»> a=arange(5);print a
[0 1 2 3 4]
»> b=arange(5).reshape(5,1);print b
[[0]
[1]
[2]
[3]
[4]]
»> print dot(a,b)
[30]点积的效果更加明显了。
-
Python Challenge Level 5
r颇为变态的一道题。。
程序入口:http://www.pythonchallenge.com/pc/def/peak.html
文中强调:pronounce it… 把它发音读出来。通过观察源代码,发现它大量提到了 Peak hell 这个词。原来并没有接触过pickle,所以在这里费了半天劲,后来还是通过观察banner.p这个文件,发现很多存储的内容,很像序列化的东西。通过搜索后才确定是这个模块。
pickle是一个python的标准模块,几乎可以将任何一个Python对象作为字符串存储。在编程的时候我们经常管它叫做Serialization,也就是序列化。但Python里面将其称之为封装(pickle)。
例如,我们可以通过如下一段代码将一个tuple存入硬盘中:
import cPickle as pickle
x=(1,2,3,4,5)
f=open(‘c:\\1.txt’,‘w’)
pickle.dump(x,f)
f.close()而1.txt中是如下形式的一段内容:
(I1
I2
I3
I4
I5
tp1
.我们没有必要理解这段文档具体的存储方式,只是知道pickle可以存储内容就好了。接下来对banner.p解包。发现结果是一个list。
然后可以求出这个list的长度是23,而且list里面还嵌套list。拍拍脑袋想想这到底是做什么用的,想不出来……又仔细观察了一下,发现这个list的深度没有超过2,看起来像个矩阵。所以想到是不是图形?
后来实验了一下,成功了,呵呵。
附上源代码:
from urllib2 import urlopen
import cPickle as pickle
f=urlopen(‘http://www.pythonchallenge.com/pc/def/banner.p’)
result=pickle.Unpickler(f).load()
print len(result)buf = ”
for line in result:
for char in line:
buf += char[0]*char[1]
print buf + ‘\n’
buf = ”结果是?看图吧。。
下一级入口地址:channel.html
-
Python Challenge Level 4
Entry: http://www.pythonchallenge.com/pc/def/linkedlist.php
此题开始变态起来了,用到了linkedlist.php.…
思路:
点击中间的大图片,发现给了一个参数nothing,现在是12345。并告之下一个数是92512。把nothing的值替换为92512,则得到了下一个值为64505。周而复始。
这道题就是要我们用Python实现递推地找到下一个数的值,直到最后出现答案。手工做就会疯掉的。。。
需要使用Python的urllib库了。。
还有一个问题就是如何去匹配得到的内容中的数字。观察发现每一页的内容是这样的:
- and the next nothing is xxxxx
也就是说是一个以数字结尾的正则表达式。我们可以用$符号匹配结尾,用\d匹配数字,用+匹配至少一个字符。这样pattern就是:(\d+)$
另外到后来很变态。。网页中间突然断掉了,然后给出让把得到的结果除以二继续。。
加起来以后执行了208次,崩溃啊~这要是手动查找……
源代码:
from urllib import urlopen import re next='12345' next='46059' #the 198th times for n in range(400): webpage=urlopen('http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s'%next) text=webpage.read() webpage.close() next = re.search(r'(\d+)$', text, re.IGNORECASE).group() print 'This is the %s time' % n print 'text is %s' % text print 'next number is %s' % next print ''结果:
peak.html
-
Python Challenge Level 3
Entry: http://www.pythonchallenge.com/pc/def/equality.html
Requirement: One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.
思路:
要求是找出加在三个大写字母中间的一个小写字母。这个小写字母左右两个方向都有三个大写字母。一看就知道应该用正则表达式解决,那么这个正则表达式怎么写呢?
有且仅有一个小写字母:[a-z]
有且仅有三个大写字母:[A-Z]{3}那么这个Regular Expression的Pattern就是:[A-Z]{3}[a-z][A-Z]{3}
………………
不对。。在此我犯了一个小错误。上述表达式不能考虑到这种情况:ABCDaABCD。即三个大写字母再外侧是什么,也需要考虑进去。它们不应该是大写字母了。
所以还应该加上非大写字母的Pattern:[^A-Z]
So.… Pattern: [^A-Z][A-Z]{3}[a-z][A-Z]{3}[^A-Z]
源代码:
content='''......''' import re import string result=re.findall(r'[^A-Z][A-Z]{3}[a-z][A-Z]{3}[^A-Z]',content) result=[l[4] for l in result] result=string.join(result,'') print result结果:
linkedlist
-
Python Challenge Level 2
http://www.pythonchallenge.com/pc/def/ocr.html
查看页面源代码后,发现了一堆乱码。。有一句话很重要:find rare characters in the mess below。题目是要我们在这堆乱码中找出仅有的几个字符。。
string模块里有个isalpha函数,来确定一个字符是否是字母。这次派上用场了。
源代码:
content='''......''' import string result=[c for c in content if c.isalpha()] print string.join(result,'')
结果:
equality
-
初学者的差距 [Python Challenge Level 1]
学习Python的时候,挑战Python Challenge。http://www.pythonchallenge.com/pc/def/map.html
我的源代码是这样的:
content='''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj. ''' con=list(content) content='' for n in range(len(con)): c=con[n] if c in [' ','.','\'','(',')']: content+=c elif c=='y': content+='a' elif c=='z': content+='b' else: content+=chr(ord(con[n])+2) print content而实际上有更简单的方法:
import string content='''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj. ''' result=string.maketrans('abcdefghijklmnopqrstuvwxyz','cdefghijklmnopqrstuvwxyzab') print string.translate(content,result)对函数的不熟悉造成了编程时间的开销。以后继续努力了。
-
BUSY Days come up
最近一段时间,觉得时间很不够用。有太多的事情需要去做,太多的知识需要去学习。每天,经常是一到了公司,就开始忙活起来,直到中午吃饭;以前的中午,大多和同事们去打打桌面足球,而现在除了简单的休息,就要继续学习,继续做事情了。
最近的工作任务虽说不太多,但是也比较繁杂,占据了一部分时间。但最大头还是学习。参加了公司的Learning Group,学习Python,学习NLP;自己也在Unix-Center.net上开了一门跟自己的工作蛮贴近的Unix Shell方面的课程。每周都要花掉不少时间来准备教程。再加上学校的综合实践,自己接的两个项目……快疯掉了。。。。
有时候就想,忙死算了…… 虽然事情是有个轻重缓急的,但是哪个似乎都耽搁不起。。要么是公司的事情,要么是学校的事情,更要么就是接的项目。。把我劈成两个人来完成该多好啊。。
另外,在学习NLP时,发现自己的概率知识又忘掉了很多,需要恶补一下了。
=======================对了,再补充一下,9月20日在本部有个Software Freedom Day的活动,我有个关于Open Source的Presentation,欢迎大家去啊,嘿嘿。具体地点和时间还不清楚。
Paul’s Online Services
Dynamic Tag Cloud
WP Cumulus Flash tag cloud by Roy Tanck and Luke Morton requires Flash Player 9 or better.
Recent Posts
- AIX Storage Learning 1
- 春节快乐! Happy Spring Festival!
- Sun is to the end of life
- 为cos-html-cache插件增加页面(Page)、标签(Tag)和分类(Category)的静态化功能
- How to configure Subversion in OpenSolaris
- 转载:IIS FastCGI PHP 环境下搭建 WordPress
- 在OpenSolaris下动态绑定域名
- Goodbye 2009, Hello 2010
- This Is It
- A Morse Code Exchanger
Recent Comments
- 新视界 (New Vision) » 在OpenSolaris下动态绑定域名 on 使用ZFS打造家庭廉价数据中心
- paul on Wordpress数据库转移网址变换的方法
- 知识 on Wordpress数据库转移网址变换的方法
- WP Super Cache V0.98 and IIS7 « Anders Heie on Speed up your WordPress Blog on IIS 7 by using WP-Super-Cache
- 博沈 on This Is It
- paul on 使用ZFS打造家庭廉价数据中心
- Anonymous on OpenSolaris 上的 Samba 服务器
- Anonymous on 使用ZFS打造家庭廉价数据中心
- Anonymous on OpenSolaris 上的 Samba 服务器
- Paul on 十年前和十年后的我们