【翻译】高效numpy指北

ref:link

why numpy

  • 运算高效

numpy 内存结构

  • 一块内存区域
  • dtype 确定了内存区域数据类型
  • metadata 比如 shapestrides etc

注:numpy 内存占用和 C 基本相同,多了常数内存消耗

numpy 广播机制

自动将常数变为可以参与运算的形式

  • 无需对常数变成可以进行运算的大小(自动)

【翻译】高效numpy指北

注意:

  • 广播机制是逻辑上的参与运算,并没有创建相应的矩阵(向量)

indexing

数组切片

[::k] k 是步长

import numpy as np
x = np.arange(6).reshape(2,3)
'''
x=[[0,1,2],
   [3,4,5]]
'''
x[:,::2]
'''
[[0, 2],
 [3, 5]]
'''
x[::2,::2]
'''
array([[0, 2]])
'''
x[:,::-1]
'''
array([[2, 1, 0],
       [5, 4, 3]])
'''
x[::-1,::-1]
'''
array([[5, 4, 3],
       [2, 1, 0]])
'''

简单的index 返回的是原数组的一个view,而非copy

x[::-1,::-1]
'''
array([[5, 4, 3],
       [2, 1, 0]])
'''
>>> x[::-1,::-1][1][1]=120
>>> x
array([[  0, 120,   2],
       [  3,   4,   5]])

>>> c =x[::-1,::-1]
>>> c[0][0]=123
>>> x
array([[  0,   1,   2],
       [  3,   4, 123]])

fancy indexing

fancy index 返回值 通常是一个 copy。

  • mask

    >>> x = np.arange(6).reshape(2,3)
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    
    >>> mask = x%2==0
    >>> mask
    array([[ True, False,  True],
           [False,  True, False]], dtype=bool
    >>> x[mask]
    array([0, 2, 4])
    ## 测试返回的是copy 而不是 view
    >>> x[mask][0]=122
    >>> x
    array([[0, 1, 2],
           [3, 4, 5]])
    
  • 通过index选择

    >>> x = np.arange(6)
    >>> x
    array([[0, 1, 2, 3, 4, 5]])
    >>> indices =[1,2,-1,1]
    >>> x[indices]
    array([1, 2, 5, 1])
    
上一篇:理解BERT模型


下一篇:python对灰度图进行傅里叶变换和低通滤波