【问题标题】:numpy vectorized operation for a large array大型数组的 numpy 向量化操作
【发布时间】:2020-08-20 03:15:04
【问题描述】:

我正在尝试通过 python3 对 numpy 数组进行一些计算。

数组:

   c0 c1 c2 c3
r0 1  5  2  7
r1 3  9  4  6
r2 8  2  1  3

这里的“cx”和“rx”是列名和行名。

如果元素不在给定的列列表中,我需要逐行计算每个元素的差异。

例如

 given a column list  [0, 2, 1] # they are column indices
 which means that 
    for r0, we need to calculate the difference between the c0 and all other columns, so we have 

    [1, 5-1, 2-1, 7-1]

    for r1,  we need to calculate the difference between the c2 and all other columns, so we have 

    [3-4, 9-4, 4, 6-4]

    for r2,  we need to calculate the difference between the c1 and all other columns, so we have 

    [8-2, 2, 1-2, 3-2]

所以,结果应该是

   1 4 1 6
   -1 5 4 2
   6 2 -1 1

由于数组可能非常大,我想通过 numpy 矢量化操作进行计算,例如广播。

但是,我不确定如何有效地做到这一点。

我已经检查了Vectorizing operation on numpy arrayVectorizing a Numpy slice operationVectorize large NumPy multiplicationReplace For Loop with Numpy Vectorized OperationVectorize numpy array for loop

但是,它们都不适合我。

感谢您的帮助!

【问题讨论】:

    标签: python arrays numpy vectorization


    【解决方案1】:

    先从数组中取出值,再做减法:

    import numpy as np
    
    a = np.array([[1,  5,  2,  7],
    [3,  9,  4,  6],
    [8,  2,  1,  3]])
    
    cols = [0,2,1]
    
    # create the index for advanced indexing
    idx = np.arange(len(a)), cols
    
    # extract values 
    vals = a[idx]
    
    # subtract array by the values
    a -= vals[:, None]
    
    # add original values back to corresponding position
    a[idx] += vals 
    
    print(a)
    
    #[[ 1  4  1  6]
    # [-1  5  4  2]
    # [ 6  2 -1  1]]
    

    Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-11
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2011-08-12
      相关资源
      最近更新 更多