3

我有一个一维数组,可以说:

import numpy as np
inp_vec = np.array([1, 2, 3])

现在,我想构造一个形式的矩阵

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

当然它可以用 for 循环来完成,但有没有更优雅的方法来做到这一点?

4

5 回答 5

6

这我也找到了一个不错的方法:

np.subtract.outer([1,2,3], [1,2,3])
于 2014-09-26T20:29:29.053 回答
4

这似乎有效:

In [1]: %paste
import numpy as np
inp_vec = np.array([1, 2, 3])

## -- End pasted text --

In [2]: inp_vec.reshape(-1, 1) - inp_vec
Out[2]: 
array([[ 0, -1, -2],
       [ 1,  0, -1],
       [ 2,  1,  0]])

解释:

您首先将数组重塑为nx1. 当您减去一维数组时,它们都被广播到nxn

array([[ 1,  1,  1],
       [ 2,  2,  2],
       [ 3,  3,  3]])

array([[ 1,  2,  3],
       [ 1,  2,  3],
       [ 1,  2,  3]])

然后按元素进行减法,这会产生所需的结果。

于 2014-09-26T07:15:26.830 回答
3
import numpy as np
inp_vec = np.array([1, 2, 3])

a, b = np.meshgrid(inp_vec, inp_vec)
print(b - a)

输出:

Array([[ 0 -1 -2],
       [ 1  0 -1],
       [ 2  1  0]])
于 2014-09-26T07:17:20.497 回答
1

使用 np.nexaxis

import numpy as np
inp_vec = np.array([1, 2, 3])

output = inp_vec[:, np.newaxis] - inp_vec

输出

array([[ 0, -1, -2],
       [ 1,  0, -1],
       [ 2,  1,  0]])
于 2020-11-11T14:48:48.077 回答
1

这是一个快速而简单的替代方案。

import numpy as np
inp_vec = np.array([1, 2, 3])

N = len(inp_vec)
np.reshape(inp_vec,(N,1)) - np.reshape(inp_vec,(1,N))

于 2021-10-17T16:34:01.843 回答