我是新手程序员。
我想创建一个“减法矩阵”。 (我缺乏描述它的词汇)。我想从所有减法组合中创建一个矩阵。
v = [1, 5, 10]
0 4 9
4 0 5
9 5 0
我认为我遗漏了一些非常基本的numpy
,但我确实知道它是什么。
谢谢
答案 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]