numpy学习笔记

来源:互联网 发布:淘宝客算销量吗 编辑:程序博客网 时间:2024/06/17 19:24

全文摘自《NumPy学习指南》。
1.)Numpy数组在竖直运算方面的效率强于Python提供的list容器。
2.)Numpy.arange()

def arange(start=None, stop=None, step=None, dtype=None):Examples        --------        >>> np.arange(3)        array([0, 1, 2])        >>> np.arange(3.0)        array([ 0.,  1.,  2.])        >>> np.arange(3,7)        array([3, 4, 5, 6])        >>> np.arange(3,7,2)        array([3, 5])        >>> a = np.arange(4)        >>> type(a)        <type 'numpy.ndarray'>        >>> print a        [0 1 2 3]  #注意点,和python的list相比,没有逗号分隔

3.) numpy中的ndarray是一个多维数组对象,该对象由两部分组成:
—1) 实际的数据
—2) 描述这些数据的元数据
大部分的数组操作仅仅修改数据部分,而不改变底层的实际数据。

numpy数组是同构的,它包含一个dtype对象所描述的元素。可以根据基本数字类型的不同组合构造一个dtype对象。

In [10]: a = numpy.arange(5)In [11]: a.dtypeOut[11]: dtype('int64')

数组a的元素的数据类型是int64.

In [12]: a.shapeOut[12]: (5,)

维度是一维,有5个元素。

创建多维数组:

In [14]: a = numpy.array([numpy.arange(2),numpy.arange(2)])In [15]: aOut[15]: array([[0, 1],       [0, 1]])In [18]: a.shapeOut[18]: (2, 2)

array函数可以依据给定的对象生成数组。给定的对象应是类数组。如上例中,我们传给array函数的对象是一个NumPy数组的对象,像这样的类数组对象是array函数的唯一必要参数,其他的参数都有默认值。


选取数组元素:

In [22]: a = numpy.array([[1,2],[3,4]])  #为什么这里可以传这样的list进去?In [23]: aOut[23]: array([[1, 2],       [3, 4]])In [29]: a[0]Out[29]: array([1, 2])In [30]: a[0][0]Out[30]: 1In [31]: type(a[0][0])Out[31]: numpy.int64In [32]: a[0][0] == 1Out[32]: True############array(...)    array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)    Create an array.     Parameters    ----------    object : array_like        An array, any object exposing the array interface, an        object whose __array__ method returns an array, or any        (nested) sequence.一个数组,任何暴露数组接口的对象,一个数组方法返回数组的对象,或任何对象(嵌套)序列。#这就是说一个嵌套的序列就行了?


python支持的数据类型有整形、浮点型以及复数型。numpy添加了更多的数据类型。
++++++++++++++++++
每一种数据类型,都有相应的类型转换函数

In [37]: a = numpy.float64(42)In [38]: type(a)Out[38]: numpy.float64In [41]: a = numpy.arange(7,dtype=numpy.uint16)In [42]: print a[0 1 2 3 4 5 6]In [43]: aOut[43]: array([0, 1, 2, 3, 4, 5, 6], dtype=uint16)In [44]: type(a)Out[44]: numpy.ndarray


数据类型对象:
数据类型对象是numpy.dtype类的实例。数据类型对象可以给出单个数组元素
在内存中占用的字节数,即dtype类的itemsize属性。

In [46]: a.dtype.itemsizeOut[46]: 2即为占用两个字节。


字符编码:
为兼容NumPy的前身Numeric。NumPy可以使用字符编码来表示数据类型。

In [47]: numpy.arange(7,dtype='f')Out[47]: array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.], dtype=float32)


创建自定义数据类型:
自定义数据类型是一种异构数据类型,可以当做用来记录电子表格或数据库中一行数据
的结构。

In [52]: t = numpy.dtype([('name',numpy.str_,40),('numitems',numpy.int32),('price',numpy.float32)])In [53]: tOut[53]: dtype([('name', 'S40'), ('numitems', '<i4'), ('price', '<f4')])    In [55]: item = numpy.array([('Meaing of life dvd',42,3.14),('butter',13,2.7)],dtype=t)In [56]: itemOut[56]: array([('Meaing of life dvd', 42, 3.140000104904175),       ('butter', 13, 2.700000047683716)],       dtype=[('name', 'S40'), ('numitems', '<i4'), ('price', '<f4')])In [57]: 

一维数组的索引和切片:

In [57]: a = numpy.arange(9)In [58]: aOut[58]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])In [59]: a[3:5]Out[59]: array([3, 4])In [60]: print a[3:5][3 4]In [61]: a[0] = 3In [62]: print a[3 1 2 3 4 5 6 7 8]


多维数组的切片和索引:

In [63]: b = numpy.arange(24).reshape(2,3,4)In [64]: bOut[64]: 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 [65]: b.shapeOut[65]: (2, 3, 4)In [66]: b[0][1][2]Out[66]: 6##############   2*3*4  == 24.In [67]: b[0,1,:]Out[67]: array([4, 5, 6, 7])In [68]: b[0,:,:]Out[68]: array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])In [69]: b[0,...]Out[69]: array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])


将一个数组展平: ravel,flatten,reshape,resize

In [71]: a = b.ravel()  #b没有变化In [73]: aOut[73]: 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 [74]: c = b.flatten()  #b也没有变化In [75]: cOut[75]: 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])使用reshape函数,设置维度:In [80]: d = b.reshape(6,4)  #b不会变化In [81]: dOut[81]: 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]])将b变成了6*4的多维数组In [82]: e = b.resize((2,12)) #直接修改了bIn [83]: e  #并没有值In [84]: bOut[84]: 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]])


数组的组合:
numpy数组有水平组合,垂直组合和深度组合等多种组合方式,我们将使用:
vstack、dstack、column_stack、row_stack以及concatenate函数来完成数组的组合。

In [87]: a = numpy.arange(9).reshape(3,3)In [88]: aOut[88]: array([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])In [89]: b = 2*aIn [90]: bOut[90]: array([[ 0,  2,  4],       [ 6,  8, 10],       [12, 14, 16]])

(1)水平组合:hstack ,concatenate

In [92]: c = numpy.hstack((a,b))In [93]: cOut[93]: array([[ 0,  1,  2,  0,  2,  4],       [ 3,  4,  5,  6,  8, 10],       [ 6,  7,  8, 12, 14, 16]])In [95]: d = numpy.concatenate((a,b),axis=1)In [96]: dOut[96]: array([[ 0,  1,  2,  0,  2,  4],       [ 3,  4,  5,  6,  8, 10],       [ 6,  7,  8, 12, 14, 16]])

(2)垂直组合: 垂直组合同样需要构造一个元组作为参数:vstack,concatenate

In [97]: numpy.vstack((a,b))Out[97]: array([[ 0,  1,  2],       [ 3,  4,  5],       [ 6,  7,  8],       [ 0,  2,  4],       [ 6,  8, 10],       [12, 14, 16]])#将concatenate函数的axis参数设置为0即可。   In [98]: numpy.concatenate((a,b),axis=0)Out[98]: array([[ 0,  1,  2],       [ 3,  4,  5],       [ 6,  7,  8],       [ 0,  2,  4],       [ 6,  8, 10],       [12, 14, 16]])

(3)深度组合: