numpy数组中各元素之间的差异

3
如果我有一个包含4个整数的数组。
[a,b,c,d]

我希望每个元素之间有所差异,使最终结果呈现如下形式:

[a-b, a-c, a-d,b-c,b-d,c-d]

符号确实很重要,我尝试移动数组,但应该有更好的方法来解决这个问题, 因为这似乎是我忘记了的一些数学问题。

import numpy as np

array_1 = np.array([1,2,3,4])

array_2 = np.copy(array_1)
array_2 = np.roll(array_2,-1)
array_2[-1] = 0

array_3 = np.copy(array_2)
array_3 = np.roll(array_3,-1)
array_3[-1] = 0

result_1n2 = array_1-array_2
result_1n3 = array_1-array_3
result_last = array_1[0] - array_1[-1]

array_result = [result_1n2[0],result_1n3[0], result_last, result_1n2[1], result_1n3[1], result_1n2[2]]

print(array_result)

[-1, -2, -3, -1, -2, -1]

我该如何处理这个问题?


1
你最好使用itertools.combinations。 - Mad Physicist
我明白了,@Mad Physicist。一旦我找到答案,我会这样做的。 - WalkerC67
2个回答

7

numpy

在每个元素处,你想减去它后面的元素。你可以使用np.trui_indices获取这个操作所需的索引。其余部分就是简单的减法:

a, b = np.triu_indices(4, 1)
result = array_1[a] - array_1[b]
triu_indices 的第二个参数可以使你向上移动一个对角线。默认值为0,这包括主对角线的索引:
>>> a
array([0, 0, 0, 1, 1, 2], dtype=int64)
>>> b
array([1, 2, 3, 2, 3, 3], dtype=int64)

>>> array_1[a]
array([1, 1, 1, 2, 2, 3])
>>> array_1[b]
array([2, 3, 4, 3, 4, 4])

>>> result
array([-1, -2, -3, -1, -2, -1])

如果你需要按照b而不是a排序输入,请使用np.tril_indices

b, a = np.tril_indices(4, -1)

迭代工具

你可以使用itertools.combinations来完成相同的事情:

result = [a - b for a, b in itertools.combinations(array_1, 2)]

如果需要的话,将结果包装成数组。


只需尝试使用itertools,就可以完美地解决问题,谢谢! - WalkerC67
还有没有办法给结果一个标识呢?例如,我可以使用循环来创建一个字符串列表[a-b,a-c,a-d,b-c,b-d,c-d],所以result [0]是a&b之间的差异。因此,当我处理result [x]时,我可以回到string [x]以了解result [x]是哪两个元素的差异。有没有相应的模块可以实现这个功能呢? - WalkerC67
@WalkerCheung。只需查看我在numpy解决方案中使用的索引即可。array_1[a[x]]是第一个数字,而array_1[b[x]]则是第二个数字。 - Mad Physicist
@MadPhysicist triu_indices方法似乎比itertools快得多,非常感谢您的回答。 - William Le
@SeanWilliam。很高兴能帮到你。通常情况下,只有当内存不足时,Python 代码才会比 NumPy 更快。 - Mad Physicist

0

这个方法与@Mad-Physicist的答案略有不同,但不如他的答案优雅。这个方法使用广播来获取差异。

import numpy as np
aa = np.arange(0,4,1);
bb = np.arange(4,8,1);
aa = aa[np.newaxis,:];
bb = bb[:,np.newaxis];
dd = aa - bb;
idx = np.triu_indices(4,1);
print(dd[idx])

为什么要计算所有可能的组合,当你只需要其中一半呢? - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接