Numpy之初识ndarray

作者: Wang华子 | 来源:发表于2017-05-18 21:52 被阅读33次

    Numpy

    ndarray

    numpy的最重要特点就是其N维数组对象(ndarray)。

    ndarray的可以对整块数据执行数学运算,语法与标量元素的元素的运算一致。
    如:

    import numpy as np
    x = array([[-0.50043612, -1.99790499,  0.66098891,  0.26490388],
           [-1.02531769,  0.50054972, -1.30755871,  1.53881345]])
    
    x + x #相加
    Out[10]: 
    array([[-1.00087224, -3.99580998,  1.32197782,  0.52980775],
           [-2.05063538,  1.00109944, -2.61511741,  3.0776269 ]])
    
    x * 10 #乘以标量
    Out[11]: 
    array([[ -5.0043612 , -19.97904992,   6.60988909,   2.64903877],
           [-10.25317691,   5.00549718, -13.07558707,  15.38813451]])
    
    1 / x #1/x被除
    Out[5]: 
    array([[-1.99825704, -0.5005243 ,  1.51288469,  3.77495415],
           [-0.97530747,  1.99780353, -0.76478401,  0.64985135]])
    
    x - x #相减
    Out[12]: 
    array([[ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]])
    
    • shape查询数组维度
    • ndim数组的维数
    • dtype查询数组数据类型
    x.shape
    Out[13]: (2, 4) # 2行4列
    
    x.ndim
    Out[15]: 2 # 2维
    
    x.dtype
    Out[14]: dtype('float64') #数据类型
    

    创建ndarray

    1. array函数

    将输入数据(列表,元组,数组,或其他),转换为ndarray

    y = list(range(1,11)) #如果直接输入y = range(1,11),会返回一个迭代器。
    y
    Out[33]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    arr1 = np.array(y)
    arr1
    Out[35]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
    
    z = [[1, 2, 3, 4],[5, 6, 7, 8]]# 生成一个嵌套序列(一组等长列表组成的列表)
    arr2 = np.array(z)
    arr2
    Out[44]: 
    array([[1, 2, 3, 4],
           [5, 6, 7, 8]])
    

    2. asarray函数

    将输入转换为ndarray,若本身是ndarray则不复制。

    3. arange函数

    arange()是python内置函数range()的数组版。
    arange()生成一个一维数组,range生成列表。

    np.arange(11) #可对比上文的range理解。
    Out[45]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
    

    4. ones,ones_like函数

    这里必须说明一下,如果ndarray没有指定数据类型,则默认为float64(浮点数)。

    ones根据指定的形状和dtype创建一个全1数组。
    ones_like以另一个数组为参数,并根据其形状和dtype创建一个全1数组。

    np.ones(2) #默认一维
    Out[46]: array([ 1.,  1.])
    
    np.ones((2,3))
    Out[47]: 
    array([[ 1.,  1.,  1.],
           [ 1.,  1.,  1.]])
    
    np.ones(3,dtype = np.int32) # 指定数据类型
    Out[51]: array([1, 1, 1])
    
    np.ones_like(arr2) #以arr2为参数
    Out[54]: 
    array([[1, 1, 1, 1],
           [1, 1, 1, 1]])
    

    5. zeros,zeros_like函数

    类似与onesones_like,但是创建的是全0数组。

    6. empty,empty_like函数

    创建新数组,分配内存空间,但不填充任何值。

    
    np.empty(2)
    Out[56]: array([ 0.,  0.])
    
    np.empty((2,4)) #2 * 4
    Out[57]: 
    array([[ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]])
    
    np.empty_like(arr2) #以arr2为参数
    Out[60]: 
    array([[0, 0, 0, 0],
           [0, 0, 0, 0]])
    

    看到这里你是不是以为np.empty会返回全0数组?

    其实不是的。

    np.empty((3,3,2)) # 3维数组
    Out[58]: 
    array([[[  6.23042070e-307,   4.67296746e-307],
            [  1.69121096e-306,   1.33512376e-306],
            [  1.33511562e-306,   1.11256817e-306]],
    
           [[  1.06811422e-306,   1.42417221e-306],
            [  1.11260619e-306,   8.90094053e-307],
            [  1.86919378e-306,   1.06809792e-306]],
    
           [[  1.37962456e-306,   1.69111861e-306],
            [  1.78020169e-306,   1.37961777e-306],
            [  7.56599807e-307,   2.56761491e-312]]])
    

    7. eye,identity函数

    返回一个N介单位矩阵。

    np.eye(5) # 创建5介单位阵
    Out[61]: 
    array([[ 1.,  0.,  0.,  0.,  0.],
           [ 0.,  1.,  0.,  0.,  0.],
           [ 0.,  0.,  1.,  0.,  0.],
           [ 0.,  0.,  0.,  1.,  0.],
           [ 0.,  0.,  0.,  0.,  1.]])
    
    np.identity(5) #创建5介单位阵
    Out[63]: 
    array([[ 1.,  0.,  0.,  0.,  0.],
           [ 0.,  1.,  0.,  0.,  0.],
           [ 0.,  0.,  1.,  0.,  0.],
           [ 0.,  0.,  0.,  1.,  0.],
           [ 0.,  0.,  0.,  0.,  1.]])
    
    

    eye(N, M = None, k = 0,dtype =float)

    第一个参数N = 行数。
    第二个参数 M = 列数,省略代表M = N 。
    第三个参数 k 代表对角线位置, = 0 代表主对角线, +1就向右上方偏移1, -1 就向左下角偏移1。
    第四个参数表示类型 dtype 默认为 float 类型。

    np.eye(4,k = 1) #向上偏移
    Out[69]: 
    array([[ 0.,  1.,  0.,  0.],
           [ 0.,  0.,  1.,  0.],
           [ 0.,  0.,  0.,  1.],
           [ 0.,  0.,  0.,  0.]])
    
    np.eye(4,k = -1) #向下偏移
    Out[70]: 
    array([[ 0.,  0.,  0.,  0.],
           [ 1.,  0.,  0.,  0.],
           [ 0.,  1.,  0.,  0.],
           [ 0.,  0.,  1.,  0.]])
    
    np.eye(4,8) #给定M
    Out[67]: 
    array([[ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.]])
    

    ndarray的数据类型

    numpy所支持的数据类型如下:

    数据类型 描述
    bool_ 以字节存储的布尔值(True 或 False)
    int_ 默认的整数类型(和 C 的 long 一样,是 int64 或者 int32)
    intc 和 C 的 int 相同(一般为 int64 或 int32)
    intp 用于下标的整数(和 C 的 ssize_t 相同,一般为int64 或者 int32)
    int8 字节(-128 到 127)
    int16 整数(-32768 到 32767)
    int32 整数(-2147483648 到 2147483647)
    int64 整数(-9223372036854775808 到 9223372036854775807)
    uint8 无符号整数(0 到 255)
    uint16 无符号整数(0 到 65535)
    uint32 无符号整数(0 到 4294967295)
    uint64 无符号整数(0 到 18446744073709551615)
    float_ float64 的简写
    float16 半精度浮点:1位符号,5位指数,10位尾数
    float32 单精度浮点:1位符号,8位指数,23位尾数
    float64 双精度浮点:1位符号,11位指数,52位尾数
    complex_ complex128 的简写
    complex64 由两个32位浮点(实部和虚部)组成的复数
    complex128 由两个64位浮点(实部和虚部)组成的复数
    string_ 固定长度的字符创类型(每个字符一个字节)

    很难记住这些numpy的dtype。我们只需要控制存储类型即可。

    arr1 = np.array([1, 2, 3],np.int32)
    arr2 = np.array([2,3,4],dtype = np.float64)
    
    arr1.dtype
    Out[14]: dtype('int32')
    arr2.dtype
    Out[11]: dtype('float64')
    

    .astype()方法可以显式的转换为dtype。

    
    float_arr1 = arr1.astype(np.float64) #整型转换为浮点型
    
    float_arr1.dtype 
    Out[16]: dtype('float64')
    
    float_arr1
    Out[17]: array([ 1.,  2.,  3.])
    

    浮点型转换为整型,只保留整数部分。

    arr3 = np.array([2.3, -1.32, -5.9, 4.8])
    
    arr3
    Out[25]: array([ 2.3 , -1.32, -5.9 ,  4.8 ])
    
    arr3.astype(np.int32)#转换为整数
    Out[26]: array([ 2, -1, -5,  4]) #可看到小数部分被丢弃了
    

    有时某个字符串不能被转换为float64,就会引发TypeError,因此,我们可以懒一点,
    像下面这样写:

    
    n_strings = np.array(['1.23','-9.6','23'],dtype = np.string_)
    
    n_strings.astype(np.float)
    Out[32]: array([  1.25656565,  -9.6       ,  23.        ])
    
    n_strings.astype(np.float64)
    Out[30]: array([  1.25656565,  -9.6       ,  23.        ])
    
    n_strings
    Out[35]: 
    array([b'1.256565653', b'-9.6', b'23'], 
          dtype='|S11')
    

    可以看到这两种结果一致。

    numpy会将其数据类型映射到等价的dtype上。
    可以发现,使用.astype()新创建了一个数组(原数组的一种拷贝),即使,与原来数据类型一致也会如此。

    以上。

    相关文章

      网友评论

        本文标题:Numpy之初识ndarray

        本文链接:https://www.haomeiwen.com/subject/yjrexxtx.html