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,size=(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表示的是它的最后那个轴方向。所以也就是行方向上面。