【问题标题】:How to initialize numpy 2D array with different values for each strip如何使用每个条带的不同值初始化 numpy 2D 数组
【发布时间】:2020-02-27 17:32:42
【问题描述】:

我想用 2 初始化 2D numpy 数组,用于列小于行 + x(x 是参数)的条带,用 3 用于列大于行 + y 的条带(假设 y > x) 像这样:

有没有比蛮力嵌套循环更快的方法:

pos_path = np.zeros((rows + 1, cols + 1), dtype=np.int32)
rows = 384;
cols = 288;
x = -12
y = 23
for r in range(0, rows+1):
    for c in range(0, cols + 1):
        if c < r + x:
             pos_path[r, c] = 2
        elif c > r + y:
             pos_path[r, c] = 3

【问题讨论】:

    标签: python python-3.x numpy vectorization


    【解决方案1】:

    我们可以简单地使用带有外部操作的范围数组来获得等效的掩码,然后使用它们以向量化的方式在输出中分配相关值,就像这样 -

    pos_path_out = np.zeros((rows + 1, cols + 1), dtype=np.int32)
    R = np.arange(0, rows+1)
    C = np.arange(0, cols+1)
    m1 = C < R[:,None] + x
    m2 = C > R[:,None] + y
    pos_path_out[m1] = 2
    pos_path_out[m2] = 3
    

    或者,我们可以直接将输出数组设置为关闭m1,然后分配给m2 -

    pos_path_out = m1*2
    pos_path_out[m2] = 3
    

    或者一口气得到m1m2的最终输出-

    pos_path_out = m1*2+m2*3
    

    对于大型阵列,利用 numexpr 的多核 -

    import numexpr as ne
    
    pos_path_out = ne.evaluate('(C < R2D + x)*2 + (C >R2D + y)*3',{'R2D':R[:,None]})
    

    另一个利用遮罩的斜坡特性,我们可以创建具有范围外比较的遮罩 -

    pos_path_out = np.zeros((rows + 1, cols + 1), dtype=np.int32)
    ra = np.arange(cols+1)
    p1 = np.arange(y,rows+y+1)
    p2 = np.arange(x,rows+x+1)
    m1 = p1[:,None]<ra
    m2 = p2[:,None]>ra
    np.putmask(pos_path_out,m1,3)
    np.putmask(pos_path_out,m2,2)
    

    或者使用np.tri 来创建这些掩码 -

    m1 = ~np.tri(rows+1,cols+1,k=y, dtype=bool)
    m2 = np.tri(rows+1,cols+1,k=x-1, dtype=bool)
    

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 2015-07-11
      • 2015-07-12
      • 2014-06-28
      • 2011-08-18
      • 2018-12-31
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多