• Numpy入门[4]——数组类型


    Numpy入门[4]——数组类型

    参考:

    https://ailearning.apachecn.org/

    使用Jupyter进行练习

    import numpy as np
    
    • 1

    之前已经看过整数数组和布尔数组,除此之外还有浮点数数组和复数数组。

    复数数组

    a = np.array([1 + 1j , 2 , 3 , 4])
    a
    
    • 1
    • 2
    array([1.+1.j, 2.+0.j, 3.+0.j, 4.+0.j])
    
    • 1
    a.dtype
    
    • 1
    dtype('complex128')
    
    • 1

    对于复数我们可以查看它的实部和虚部:

    a.real
    
    • 1
    array([1., 2., 3., 4.])
    
    • 1
    a.imag
    
    • 1
    array([1., 0., 0., 0.])
    
    • 1

    还可以设置它们的值:

    a.imag=[1, 2, 3, 4]
    a
    
    • 1
    • 2
    array([1.+1.j, 2.+2.j, 3.+3.j, 4.+4.j])
    
    • 1

    查看复共轭:

    a.conj()
    
    • 1
    array([1.-1.j, 2.-2.j, 3.-3.j, 4.-4.j])
    
    • 1

    这些属性方法可以用在浮点数或者整数数组上:

    b = np.array([0.0, 1, 2, 3])
    b.dtype
    
    • 1
    • 2
    dtype('float64')
    
    • 1
    b.real
    
    • 1
    array([0., 1., 2., 3.])
    
    • 1
    b.imag
    
    • 1
    array([0., 0., 0., 0.])
    
    • 1
    # 这里,虚部是只读的,并不能修改它的值:
    b.conj()
    
    • 1
    • 2
    array([0., 1., 2., 3.])
    
    • 1

    指定数组类型

    构建数组的时候,数组会根据传入的内容自动判断类型:

    a = np.array([0, 1.0, 2, 3])
    # 对于浮点数,默认为双精度:
    a.dtype
    
    • 1
    • 2
    • 3
    dtype('float64')
    
    • 1

    也可以在构建的时候指定类型:

    b = np.array([0,1.0,2,3],
             dtype=np.float32)
    b.dtype
    
    • 1
    • 2
    • 3
    dtype('float32')
    
    • 1

    除此之外,还可以指定有无符号,例如无符号整数:

    c = np.array([0,1,2,3],
             dtype=np.uint8)
    c.dtype
    
    • 1
    • 2
    • 3
    dtype('uint8')
    
    • 1

    uint8 只使用一个字节,表示 0 到 255 的整数。

    Numpy类型

    具体如下:

    image-20221202160959632

    任意类型的数组:

    e = np.array([1,1.2,'hello', [10,20,30]], 
              dtype=object)
    e
    
    • 1
    • 2
    • 3
    array([1, 1.2, 'hello', list([10, 20, 30])], dtype=object)
    
    • 1
    # 乘法
    a * 2
    
    • 1
    • 2
    array([0., 2., 4., 6.])
    
    • 1

    类型转换

    原始数组

    origin= np.array([1.5, -3], 
             dtype=np.float32)
    origin
    
    • 1
    • 2
    • 3
    array([ 1.5, -3. ], dtype=float32)
    
    • 1

    asarray函数

    np.asarray(origin, dtype=np.float64)
    
    
    • 1
    • 2
    array([ 1.5, -3. ])
    
    • 1
    np.asarray(origin,dtype=np.uint8)
    
    • 1
    array([  1, 253], dtype=uint8)
    
    • 1

    asarray不会修改原来数组的值

    origin
    
    • 1
    array([ 1.5, -3. ], dtype=float32)
    
    • 1

    当类型相同的时候,asarray 并不会产生新的对象,而是使用同一个引用。

    这么做的好处在与,asarray 不仅可以作用于数组,还可以将其他类型转化为数组。

    有些时候为了保证输入值是数组,需要将其使用 asarray 转化,当它已经是数组的时候,并不会产生新的对象,这样保证了效率。

    astype方法

    astype方法返回一个新数组:

    origin.astype(np.float64)
    
    • 1
    array([ 1.5, -3. ])
    
    • 1
    origin.astype(np.uint8)
    
    • 1
    array([  1, 253], dtype=uint8)
    
    • 1

    astype也不会改变原来数组的值:

    origin
    
    • 1
    array([ 1.5, -3. ], dtype=float32)
    
    • 1

    另外,astype 总是返回原来数组的一份复制,即使转换的类型是相同的:

    change = origin.astype(np.float32)
    origin is change
    
    • 1
    • 2
    False
    
    • 1

    view方法

    a = np.array([1,2,3,4],dtype=np.int32)
    a
    
    • 1
    • 2
    array([1, 2, 3, 4])
    
    • 1

    view会将 a 在内存中的表示看成是 uint8 进行解析:

    b = a.view(np.uint8)
    b
    
    • 1
    • 2
    array([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0], dtype=uint8)
    
    • 1
    a[0] = 258
    a
    
    • 1
    • 2
    array([258,   2,   3,   4])
    
    • 1

    修改 a 会修改 b 的值,因为共用一块内存

    b
    
    • 1
    array([2, 1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0], dtype=uint8)
    
    • 1
  • 相关阅读:
    LSTM 浅析
    kernel heap bypass smep,smap && 劫持modprobe_path
    Spark中sc.textFile()读取文件路径
    微软外服工作札记②——聊聊微软的知识管理服务平台和一些编程风格
    联想领像M102W激光打印机报错E0问题的描述
    【无标题】
    盘点全球 101 款 AI Agent 产品丨2月更新
    Linux基础操作命令详解
    Android扫码连接WIFI实现
    Spring | 依赖注入详解(DI)
  • 原文地址:https://blog.csdn.net/weixin_47692652/article/details/128150525