python 科学计算学习一:numpy快速处理数据(2)


1,像c语言中的struct一样构造结构类型:  

  1 import numpy as np
  2 mytype=np.dtype({'name':['name','age','weight'],'formats':['s32','i',    'f']},align=True)
  3 a=np.array([('zhang',32,75.5),('wang',24,65.2)],dtype=mytype)

2,numpy中的数据存储类型是C语言的格式,第0轴是最上位。也可以是Fortan语言格式,第0轴是最下位;通过数组的flags属性就可以查看数据存储区域的属性:

>>> a=np.array([[1,2],[2,3],[2,3]])
>>> a.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

3,数组的转置:a.T就是a的转置了。但是并不改变a原来的数值;

4,numpy内部 的函数对于大量数据的计算速度高于python本身的math库里面的函数;下面的例子比较他们的速度:

1 import numpy as np
  2 import time
  3 import math
  4 
  5 x=[i*0.001 for i in xrange(1000000)]
  6 start=time.clock()
  7 for i,t in enumerate(x):
  8     x[i]=math.sin(t)
  9 print "math.sin:",time.clock()-start
 10 
 11 
 12 x=[i*0.001 for i in xrange(1000000)]
 13 x=np.array(x)
 14 start=time.clock()
 15 np.sin(x)
 16 print "numpy.sin:",time.clock()-start
 17 
 18 
 19 x=[i*0.001 for i in xrange(1000000)]
 20 start=time.clock()
 21 for i,t in enumerate(x):
 22     x[i]=np.sin(t)
 23 
 24 print "numpy.sin loop:",time.clock()-start

得到的结果:

math.sin: 0.29
numpy.sin: 0.04
numpy.sin loop: 2.12

5,数组中可以进行四则运算,逻辑运算;在进行四则运算的时候shape很重要,举例说明。

(1)

>>> a
array([0, 1, 2, 3, 4])
>>> b=np.arange(1,5)
>>> b
array([1, 2, 3, 4])
>>> a+b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (5) (4) 
>>> b=np.arange(1,6)
>>> a+b
array([1, 3, 5, 7, 9])

(2)

>>> c=a.reshape(-1,1)
>>> c.shape
(5, 1)
>>> c+b
array([[1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6],
       [3, 4, 5, 6, 7],
       [4, 5, 6, 7, 8],
       [5, 6, 7, 8, 9]])

(3)

>>> a=np.array([[1,2,3,4,5]])
>>> a.shape
(1, 5)
>>> b.shape
(5,)
>>> a+b
array([[ 2,  4,  6,  8, 10]])  

注意:上面的例子没有说明的,数值就是原来的,没有变。比较上面知道,基本上横向量和列向量是可以任意加减的。但是其他的要有一样的shape才可以。


6,可自定义分段函数,也可以用where(),或者是select()来表示(很像C语言里面的 condition?a:b,判断条件是否正确,正确则执行a,否则b)。具体例子:

>>> x=np.arange(10)
>>> np.where(x<5,9-x,x)
array([9, 8, 7, 6, 5, 5, 6, 7, 8, 9]) 表示的是产生一个数组0~9,然后得到另一个数组,这个数组满足:当x<5的时候它的值变为9-x,否则保持为x)。

>>> np.select([x<2,x>6,True],[7-x,x,2*x])
array([ 7,  6,  4,  6,  8, 10, 12,  7,  8,  9]) 表示的是当x满足第一个条件时,执行7-x,当x满足第二个条件事执行x,当二者都不满足的时候执行2*x。

但是这两个都比较耗内存,所以引入piecewise(),因为它只有在满足条件的时候才计算。

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.piecewise(x,[x<2,x>6],[7-x,x,2*x])
array([7, 6, 0, 2, 4, 6, 8, 0, 1, 2])     我也不太清楚???

7,随机生成数组:np.random.rand(10)随机生成一个10个值(值的大小为0~1)的一维数组,   np.random.rand(10,10)随机生成一个10*10(值的大小为0~1)的二维数组,  ,np.random.randint(1,10,(4,5))随机生成一个4*5(值的大小为1~10)的数组,;用 b = arange(20).reshape(4,5) 也可以达到这个效果。

8,a.repeat(6,axis=0)表示的是将a按照第一轴的方向扩展6次得到的数组。axis=0表示的是按照第一轴的方向操作,也就是列方向上;若是axis=1就是行方向上面;这个也是等价于axis=-1的。因为-1表示的是它的最后那个轴方向。所以也就是行方向上面。

9,关于enumerate()和zip()的用法:在vim中编辑好如下代码,

  1 a=['a',2,'s']
  2 b=[6,7,8]
  3 for i,(x,y) in enumerate(zip(a,b)):
  4     print i,x,y

保存文件(如a.py)以后,在终端中输入:python a.py运行文件,得到如下结果:

0 a 6
1 2 7
2 s 8

对于zip():

alist = ['a1', 'a2', 'a3']

blist = ['b1', 'b2', 'b3']

for a, b in zip(alist, blist):

    print a, b

Results:

a1 b1

a2 b2

a3 b3


由此便知到它的用法了。





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值