遍历矩阵 Python

Iterating through matrices Python

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

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)...有更简单的方法吗?

是这样的吗?

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])))

广播 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]])