Numpy

https://www.yiibai.com/numpy/

NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。

类型

NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型。 它描述相同类型的元素集合。 可以使用基于零的索引访问集合中的项目。

ndarray中的每个元素在内存中使用相同大小的块。 ndarray中的每个元素是数据类型对象的对象(称为 dtype)。

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
a = np.array([1,2,3])
a = np.array([[1, 2], [3, 4]])
a = np.array([1, 2, 3,4,5], ndmin = 2)
a = np.array([1, 2, 3], dtype = complex)

astype可以用来进行类型转换
finfo可以用来查看取值范围

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用端记号  
import numpy as np
dt = np.dtype('>i4')
print dt

dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
# 或者直接用a = np.array([1,2], dtype = dt)
print a
print a['age']

student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print a

每个内建类型都有一个唯一定义它的字符代码:

  • ‘b’:布尔值
  • ‘i’:符号整数
  • ‘u’:无符号整数
  • ‘f’:浮点
  • ‘c’:复数浮点
  • ‘m’:时间间隔
  • ‘M’:日期时间
  • ‘O’:Python 对象
  • ‘S’, ‘a’:字节串
  • ‘U’:Unicode
  • ‘V’:原始数据(void)

字节序:

http://www.ruanyifeng.com/blog/2016/11/byte-order.html
降序(Big-endian)大端字节序存储时 由左到右
升序(Little-endian)小端字节序存储时 由右向左
1byte是8bit,所以需要两位16进制

数组属性

  • ndarray.shape
    • 可读可写
  • reshape
    • 类似直接修改shape,但不修改原来的数组
  • dim
    • 返回数组的维度
  • itemsize
    • 字节单位的长度,如int8(-128~127)的字节长度为1
  • flags
    • C_CONTIGUOUS (C) 数组位于单一的、C 风格的连续区段内
    • F_CONTIGUOUS (F) 数组位于单一的、Fortran 风格的连续区段内
    • OWNDATA (O) 数组的内存从其它对象处借用
    • WRITEABLE (W) 数据区域可写入。 将它设置为flase会锁定数据,使其只读
    • ALIGNED (A) 数据和任何元素会为硬件适当对齐
    • UPDATEIFCOPY (U) 这个数组是另一数组的副本。当这个数组释放时,源数组会由这个数组中的元素更新

数组创建

  • empty:未初始化,指定shape,dtype和order
  • zeros:初始化为0
  • ones:初始化为1
  • asarray:接受列表、列表的元组、元组、元组的元组、元组的列表等各种形式的输入,并且可以指定dtype和order
  • frombuffer:缓冲区作为参数,指定dtype、count(读取的数字数量,默认-1读取全部)、offset
  • fromiter:迭代器
  • range:设定start、stop、step、dtype
  • linspace:设定start、stop、num、endpoint(是否包含stop)、retstep(返回样例及步长)、dtype
  • logspace:对数轴上均匀分布,start(起始为base ** start)、stop、num、endpoint、base(默认为10)、dtype

数组方法

  • 切片:用起始、终止、步长。如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    a = np.arange(10)
    s = slice(2,7,2)
    print a[s]

    >>> a = np.arange(10)
    >>> a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> a[3:8]
    array([3, 4, 5, 6, 7])
    >>> a[3:8:2]
    array([3, 5, 7])
    >>> a+9
    array([ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18])
    >>> (a+9)[a[3:8:2]]
    array([12, 14, 16])
  • 第二列用a[...,1] ,第二行用a[1,...],第二列及以后所有为a[...,1:]

    • 高级索引:

      • 整数索引:y = x[[0,1,2], [0,1,0]]包括数组中(0,0),(1,1)和(2,0)位置处的元素。
      • 布尔索引:x[x > 5]可以输出大于5的所有元素值,a[~np.isnan(a)]可以过滤nan
    • 广播

      • 对数组的算术运算通常在相应的元素上进行。 如果两个阵列具有完全相同的形状,则这些操作被无缝执行。在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。 较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。
        1
        2
        3
        4
        5
        6
        >>> np.array([1,2])+1
        array([2, 3])
        >>> np.array([1,2])*3
        array([3, 6])
        >>> np.array([1,2])*np.array([2,3])
        array([2, 6])
        广播示例
    • 迭代:数组变成迭代器,np.nditer

    • 转置:直接a.T

    • 修改形状:reshape

    • flat:一维迭代器

    • flatten:数组副本,可以带参数order

    • ravel

    • transpose:翻转给定的维度,同.T