2017-06-19 171 views
1

如果我有两个列表,并希望通过从另一个减去一个列表进行迭代,我会如何去做这件事?我在想广播。现在,我有:遍历矩阵蟒蛇Python

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

我想在每个数组2值中减去了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] 

我想在每个数组2值中减去了array1,并输出一个新的矩阵:

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

那么到底它是一个4x4矩阵。

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

回答

2

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

非常漂亮,谢谢!一次减去一行,然后连接所有新值并重新设置它......这更容易! – Camerann

0

像这样的东西?

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