【问题标题】:Iterating through matrices Python遍历矩阵 Python
【发布时间】:2017-06-19 18:06:17
【问题描述】:

如果我有两个列表,并且想通过从另一个中减去一个来迭代,我将如何处理?我在想广播。现在我有:

array1 = [0,2,2,0]
array2 = [2,2,0,1]

我想从 array2 中的每个值中减去 array1 并制作一个新的输出矩阵:

output = [2, 0, 0, 2,
          2, 0, 0, 2,
          0, -2, -2, 0,
          1, -1, -1, 1]

所以最后它是一个 4x4 矩阵。

这可能吗?使用广播是最简单的方法吗?我正在考虑将 array2 中的每一行值变成它自己的数组,使用广播从 array2 中减去它,然后将最后的所有数组相加成一个大数组(使用 Numpy)......有没有更简单的方法?

如果我有两个列表,并且想通过从另一个中减去一个来迭代,我将如何处理?我在想广播。现在我有:

array1 = [0,2,2,0]
array2 = [2,2,0,1]

我想从 array2 中的每个值中减去 array1 并制作一个新的输出矩阵:

output = [2, 0, 0, 2,
          2, 0, 0, 2,
          0, -2, -2, 0,
          1, -1, -1, 1]

所以最后它是一个 4x4 矩阵。

这可能吗?使用广播是最简单的方法吗?我正在考虑将 array2 中的每一行值变成它自己的数组,使用广播从 array2 中减去它,然后将最后的所有数组相加成一个大数组(使用 Numpy)......有没有更简单的方法?

【问题讨论】:

    标签: python arrays matrix dot-product


    【解决方案1】:

    广播numpy:

    >>> a1 = np.array([0,2,2,0])
    >>> a2 = np.array([2,2,0,1])
    >>> a2[:, np.newaxis] - a1
    array([[ 2,  0,  0,  2],
           [ 2,  0,  0,  2],
           [ 0, -2, -2,  0],
           [ 1, -1, -1,  1]])
    

    【讨论】:

    • 非常漂亮,谢谢!一次减去一行,然后连接所有新值并重塑它......这更容易!
    【解决方案2】:

    这样的?

    def all_differences(x, y):
        return (a - b for a in y for b in x)
    
    print(list(all_differences([0, 2, 2, 0], [2, 2, 0,1])))
    # -> [2, 0, 0, 2, 2, 0, 0, 2, 0, -2, -2, 0, 1, -1, -1, 1]
    

    它只是针对第一个列表中的每个项目迭代第二个列表中的每个项目,并给出它们的区别。

    这也可以用itertools.product 解决,并且可以推广到多个列表:

    import itertools
    import functools
    import operator
    
    difference = functools.partial(functools.reduce, operator.sub)
    
    def all_differences(*lists):
        return map(difference, itertools.product(*reversed(lists)))
    
    print(list(all_differences([0, 2, 2, 0], [2, 2, 0,1])))
    

    或者只处理两个列表:

    import itertools
    
    def all_differences(x, y):
        return (b - a for (a, b) in itertools.product((x, y)))
    
    print(list(all_differences([0, 2, 2, 0], [2, 2, 0,1])))
    

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 2015-07-21
      • 1970-01-01
      • 2018-10-27
      相关资源
      最近更新 更多