本篇使用的是ipython shell进行的直接测试,比在文本中需要显示编写print()函数要方便的多,在linux下直接执行sudo apt-get install ipython 即可安装.之后在控制台运行ipython –pylab,后缀是为了支持numpy的导入
创建等差数组:arange()函数
创建一个numpy等差数组,第一个数默认从零开始.
1.. arange(5):创建一个含有5个元素,0–4的一个数组
In [1]: a=arange(5)
In [2]: a
Out[2]: array([0, 1, 2, 3, 4])
2.. arange(1,5):创建一个含有4个元素,1–4的一个数组
In [3]: a=arange(1,5)
In [4]: a
Out[4]: array([1, 2, 3, 4])
3.. arange(1,9,2):创建一个含有4个元素,1,3,5,7的一个数组
In [5]: a=arange(1,9,2)
In [6]: a
Out[6]: array([1, 3, 5, 7])
生成数组:array()函数
array函数可以根据给定的对象生成数组.给定的对象应该是类数组,如python中的列表.
In [1]: a=array([arange(3),arange(1,4),arange(1,7,2)])
In [2]: a
Out[2]:
array([[0, 1, 2],
[1, 2, 3],
[1, 3, 5]])
把数组列表作为参数传给array函数,创建了一个多维的数组.
数组维度:shape属性和reshape()函数
shape属性是数组的一个属性,返回一个元组(tuple),元组中的元素是该数组上每一个维度的大小.
In [1]: a=arange(9)
In [2]: a.shape
Out[2]: (9,)
我们定义了一个一维的数组,shape返回了,一个维度9个元素的信息.
也可以直接给shape属性赋值一个元组来为其改变维度:
In [1]: a=arange(24)
In [2]: a
Out[2]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
In [3]: a.shape=(2,3,4)
In [4]: a
Out[4]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
rashape()函数是用来为数组改变维度,分配每一个维度上的元素个数,如果分配的元素个数不符合原来数组会抛出异常
In [3]: a=arange(24).reshape(2,3,4)
In [4]: a.shape
Out[4]: (2, 3, 4)
In [5]: a
Out[5]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
24个元素的数组分成了2*3*4的三维向量.
取数组索引和切片
一维数组切片和索引:
跟python中的数组取法一致
1.取出第4个到第7个元素切片
In [1]: a=arange(9)
In [2]: a[3:7]
Out[2]: array([3, 4, 5, 6])
2.取出0-7,间隔2
In [3]: a[:7:2]
Out[3]: array([0, 2, 4, 6])
3.翻转数组
In [9]: a[::-1]
Out[9]: array([8, 7, 6, 5, 4, 3, 2, 1, 0])
多维数组的索引和切片:
还是利用上面的例子
In [1]: a=arange(24).reshape(2,3,4)
In [2]: a
Out[2]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
1.取出任一位置元素
In [3]: a[1,2,3]
Out[3]: 23
一定要记住,每一个维度的元素都是角标从0开始的.
*我们回顾并比较和一维数组取元素和切片写法,一维使用了”:”作为任意取值,而没有”,”,多维数组中利用了逗号来对维度进行分割,在每一个维度上的取值方式仍然跟一维数组一样.
我们来个看起来复杂,但实际只是不同维度单独取不同的部分:
In [4]: a[:,:2,::2]
Out[4]:
array([[[ 0, 2],
[ 4, 6]],
[[12, 14],
[16, 18]]])
第一维全部都要用了一个”:”
第二维要2个元素”:2”
第三维要全部但间隔为2取值
来看看翻转是不是跟一维数组一样:
In [5]: a[:,::-1,::-1]
Out[5]:
array([[[11, 10, 9, 8],
[ 7, 6, 5, 4],
[ 3, 2, 1, 0]],
[[23, 22, 21, 20],
[19, 18, 17, 16],
[15, 14, 13, 12]]])
显然我们是把第二个和第三个维度进行了翻转,接下来随意的在每个维度上不同取法试试:
In [6]: a[:,:1,::2]
Out[6]:
array([[[ 0, 2]],
[[12, 14]]])
In [7]: a[:,1,::2]
Out[7]:
array([[ 4, 6],
[16, 18]])
In [8]: a[1,1,::2]
Out[8]: array([16, 18])
数组展平:raval()和flatten()函数
raval()和flatten()都是用来展平数组的,但是flatten()展平后分配内存来保存结果,而raval()只是返回视图(view)
In [1]: a=arange(24).reshape(2,3,4)
In [2]: a
Out[2]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [3]: a.ravel()
Out[3]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
In [4]: a
Out[4]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [5]: a.flatten()
Out[5]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
数组转置:transpos()函数
数据处理中常用转置,用上面的例子转置:
In [6]: a.transpose()
Out[6]:
array([[[ 0, 12],
[ 4, 16],
[ 8, 20]],
[[ 1, 13],
[ 5, 17],
[ 9, 21]],
[[ 2, 14],
[ 6, 18],
[10, 22]],
[[ 3, 15],
[ 7, 19],
[11, 23]]])
数组的各种属性
ndim,数组的维数
size,数组的元素总个数
itemsize,元素在内存中的所占字节数
real,给出复数数组的实部
imag,给出复数数组的虚部
flat,属性将返回一个numpy.flatter对象,这是获得flatter对象的唯一方式
数组的拼接和分割
水平拼接hstack(a,b)
垂直拼接vstack(a,b)
行拼接row_stack(a,b)
列拼接colum_stack(a,b)
深度拼接dstack(a,b)
分成3个子组
水平分割hsplit(a,3)
垂直分割vsplit(a,3)
深度分割dsplit(a,3)