【问题标题】:Relative difference between elements in an array数组中元素之间的相对差异
【发布时间】:2019-12-05 14:48:54
【问题描述】:

我需要一个 (n, 3) 数组的第一列中的每个元素的 x2 - x1 n 次差异,以便产生一个 (n, n) 数组。意思是,我需要:

[0,0] - [0,0], [1,0] - [0,0], [2,0] - [0,0],...[n,0] - [0,0]
[0,0] - [1,0], [1,0] - [1,0], [2,0] - [1,0],...[n,0] - [0,0]
                             :
[0,0] - [n,0], [1,0] - [n,0], [2,0] - [n,0],...[n,0] - [n,0]

我已经尝试过numpy.diff(a[:,0]),尽管这只会产生直接相邻元素之间的差异,即[1,0] - [0,0], [2,0] - [1,0],...[n,0] - [n-1,0]

【问题讨论】:

  • 我不太明白这个问题。所以你需要所有列的差异
  • 我需要第一个元素和所有其他元素之间的差异,第二个元素和所有其他元素之间的差异,第三个元素和所有其他元素之间的差异等等。例如数组[[5 2 4] [3 9 8] [8 3 7]] 我需要5 - 53 - 58 - 55 - 33 - 38 - 35 - 83 - 88 - 8。提供一个新的 (3, 3) 数组 [[0 -2 3] [2 0 5] [-3 -5 0]] 我希望这是有道理的

标签: python numpy


【解决方案1】:

绝对不要为此类问题使用三个嵌套的 for 循环。

说实话,我不太了解你的最终目标,但是 IIUC,你可以使用广播

(a - a[:, None])[..., 0]

产生

array([[ 0, -2,  3],
       [ 2,  0,  5],
       [-3, -5,  0]])

如果您想对第二列执行相同的操作,只需使用[..., 1] 等即可。


如果您真的只需要在第一列中进行此操作(而不是在其他列中),那么计算所有内容然后提取第一个结果可能会过大。您可以先切片,然后使用广播进行减法

f = a[:, 0]
f - f[:, None]

【讨论】:

    【解决方案2】:

    所以,问题的表述有点令人困惑,如果在原始问题的 cmets 中有示例以及更数学的表述,那就太好了。

    您可能可以使用numpy 来实现,但它看起来非常具体,以至于我坚持只使用lists。以下是使用评论示例的方法:

    import numpy as np
    
    ex = [
        [5, 2, 4], 
        [3, 9, 8], 
        [8, 3, 7]
    ]
    
    ex_as_np_array = np.array(ex)
    rows, cols = ex_as_np_array.shape[0], ex_as_np_array.shape[1]
    
    # Forcing in order to only get the results for the first column
    # Otherwise the result is going to be (9, 3) or (nrows*ncols, nrows).
    cols = 1
    
    result = []
    for row in range(0, rows):
        for col in range(0, cols):
    
            row_result = []
            for i in range(0, rows):
    
                operation = ex[i][col] - ex[row][col]
                row_result.append(operation)
    
            result.append(row_result)    
    
    result_as_np_array = np.array(result)
    

    这给出了:

    Result:
    [[ 0 -2  3]
     [ 2  0  5]
     [-3 -5  0]]
    
    Shape:
    (3, 3)
    

    【讨论】: