通过Python迭代矩阵

通过Python迭代矩阵,python,arrays,matrix,dot-product,Python,Arrays,Matrix,Dot Product,如果我有两个列表,并希望通过从另一个列表中减去一个来迭代,我将如何进行?我在想广播。现在我有: array1 = [0,2,2,0] array2 = [2,2,0,1] 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

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

array1 = [0,2,2,0]
array2 = [2,2,0,1]
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]
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]
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]
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]
它只是针对第一个列表中的每个项目对第二个列表中的每个项目进行测试,并给出它们的差异

这也可以通过以下方法解决,并且可以推广到多个列表:

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

非常漂亮,谢谢!是一次减去一行,然后连接所有新值并重新塑造它。。。这容易多了!