- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NumPy使用手记NumPy使用手记
NumPy使用手记[z]
Posted on 2010-08-03 08:45 白途思 阅读(699) 评论(0) 编辑 收藏
前面一个NumPy系列基本上是抄书,没有多少具体的内容。最近做实验经常使用NumPy,确实感觉到向量计算的强大。这个系列开始,我记录在使用NumPy使用中的一些具体的技巧和注意事项。
1) 巧用 where函数
? where函数是numpy的内置,也是一个非常有用的函数,提供了快速并且灵活的计算功能。
def f_norm_1(data, estimate):?? residule = 0?? for row_index in range(data.shape[0]):???? for column_index in range(data.shape[1]):?????? if data[row_index][column_index] != 0:???????? residule += (data[row_index][column_index] - estimate[row_index][column_index]) ** 2?? return residule
def f_norm_2(data, estimate)?
??? return sum(where(data != 0, (data-estimate) **2, 0))
这两段代码完成同样的功能,计算两个矩阵的差,然后将残差进行平方,注意,因为我需要的是考虑矩阵稀疏性,所以不能用内置的norm,函数1是我用普通的python写的,不太复杂,对于规模10*10的矩阵,计算200次耗时0.15s,函数2使用了where函数和sum函数,这两个函数都是为向量计算优化过的,不仅简介,而且耗时仅0.03s, 快了有五倍,不仅如此,有同学将NumPy和matlab做过比较,NumPy稍快一些,这已经是很让人兴奋的结果。
?
本篇我们看看NumPy中最为基本的Array操作
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]
点积的效果更加明显了。
ndarray的几个常用属性:
· shape: 代表一个array的形态,是一个向量还是一个矩阵,抑或是一个更复杂的向量组。
· ndim: 代表这个array的维度
· size: 在array中拥有的元素数量
· itemsize: 这个array中每一个
文档评论(0)