如何创建“减法矩阵”? -蟒蛇

时间:2017-04-16 01:17:28

标签: python numpy scipy

我是新手程序员。

我想创建一个“减法矩阵”。 (我缺乏描述它的词汇)。我想从所有减法组合中创建一个矩阵。

v = [1, 5, 10]

0   4   9
4   0   5
9   5   0

我认为我遗漏了一些非常基本的numpy,但我确实知道它是什么。

谢谢

3 个答案:

答案 0 :(得分:2)

您可以使用outer ufunc的subtract方法。 outer将操作(在本例中为减法)应用于每个可能的对,并将结果排列在矩阵中:

v = [1, 5, 10]
np.absolute(np.subtract.outer(v, v))
# array([[0, 4, 9],
#        [4, 0, 5],
#        [9, 5, 0]])

方便的是,它接受列表等,而无需将它们显式地转换为数组。

答案 1 :(得分:1)

您可以使用 numpy 广播:

v = np.array([1, 5, 10])

# v[:, None] creates a 2d array, when subtracted by a 1d array, the broadcasting rule will
# make a cartesian subtraction 
np.abs(v[:, None] - v)

#array([[0, 4, 9],
#       [4, 0, 5],
#       [9, 5, 0]])

答案 2 :(得分:0)

如果您不想使用numpy,则可以使用嵌套的for循环:

v = [1, 5, 10]
vLen = len(v)
subMatrix = [[0]*vLen for x in range(vLen)] //creates empty matrix
for i in range(vLen):
    for j in range(vLen):
        subMatrix[j][i] = abs(v[i] - v[j])
# [[0, 4, 9],
#  [4, 0, 5],
#  [9, 5, 0]]

编辑:@aryamccarthy指出for循环效率低于numpy广播。他给出的另一种选择是使用列表理解来得到相同的结果:

v = [1, 5, 10]
subMatrix = [[abs(i - j) for i in v] for j in v]