如果我有两个列表,并希望迭代从另一个中减去一个,我将如何解决这个问题?我在想广播。现在我有:
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)......有更简单的方法吗?
答案 0 :(得分: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]])
答案 1 :(得分: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])))