我有两个向量(1D数组)或不同的大小。我想计算它们每个点之间的距离(这里是差异),即我的长向量l
的第一个点与我的短向量v
的每个点之间的差异,对于我的长矢量的第二点等等。
我想将结果存储在[len(l), len(l)-len(v)+1]
数组中(称为d
)。为此,我想使用过滤器矩阵(这不是强制性的)。
import numpy
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
v = [1, 2, 3, 4]
nc, nr = len(l)-len(v)+1, len(l) # n_col, n_rows
x = numpy.array([[i-j for j in range(nc)] for i in range(nr)])
filter = ((x >= 0) & (x < len(v)))
d = numpy.zeros((nr, nc))
所以我的filter
矩阵是:
[[ True False False False False False False]
[ True True False False False False False]
[ True True True False False False False]
[ True True True True False False False]
[False True True True True False False]
[False False True True True True False]
[False False False True True True True]
[False False False False True True True]
[False False False False False True True]
[False False False False False False True]]
其中True
值表示我期望的非零值。
我可以根据过滤器更改d
的值(例如:d[filter] = 2
),但是我没有成功找到调用l
的第x个点的方法, v
的第y点。
注意:我注意到x[filter]
返回[0 1 0 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 0 3 2 1 3 2 3]
,这是我要为v
调用的索引。但v[x[filter]]
会返回错误(TypeError: only integer arrays with one element can be converted to an index
)
有关如何访问filter
为True
或其他解决方案(包含或不包含过滤器矩阵)的行/列索引的任何帮助,我们将不胜感激。
输出应为:
[[ l[0]-v[0] 0 0 0 0 0 0]
[ l[1]-v[1] l[1]-v[0] 0 0 0 0 0]
[ l[2]-v[2] l[2]-v[1] l[2]-v[0] 0 0 0 0]
[ l[3]-v[3] l[3]-v[2] l[3]-v[1] l[3]-v[0] 0 0 0]
[ 0 l[4]-v[2] l[4]-v[2] l[4]-v[1] l[4]-v[0] 0 0]
[ 0 0 l[5]-v[3] l[5]-v[2] l[5]-v[1] l[5]-v[0] 0]
[ 0 0 0 l[6]-v[3] l[6]-v[2] l[6]-v[1] l[6]-v[0]]
[ 0 0 0 0 l[7]-v[3] l[7]-v[2] l[7]-v[1]]
[ 0 0 0 0 0 l[8]-v[3] l[8]-v[5]]
[ 0 0 0 0 0 0 l[9]-v[3]]]
答案 0 :(得分:0)
这是你想要的输出,即v和l之间的成对距离吗?
np.asarray(v)[:,None] - np.asarray(l)
Out[679]:
array([[ 0, -1, -2, ..., -7, -8, -9],
[ 1, 0, -1, ..., -6, -7, -8],
[ 2, 1, 0, ..., -5, -6, -7],
[ 3, 2, 1, ..., -4, -5, -6]])
答案 1 :(得分:0)
这是否符合您想要的输出?
x*filter
Out[710]:
array([[0, 0, 0, ..., 0, 0, 0],
[1, 0, 0, ..., 0, 0, 0],
[2, 1, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 3, 2, 1],
[0, 0, 0, ..., 0, 3, 2],
[0, 0, 0, ..., 0, 0, 3]])
答案 2 :(得分:0)
根据艾伦的答案,我设法获得了所需的输出。
arr = numpy.asarray(l) - numpy.asarray(v)[:,None]
for i in range(d.shape[1]):
d[i:i+len(v),i] = numpy.diagonal(arr[:,i:i+len(v)])
返回:
[[ 0. 0. 0. 0. 0. 0. 0.]
[ 0. 1. 0. 0. 0. 0. 0.]
[ 0. 1. 2. 0. 0. 0. 0.]
[ 0. 1. 2. 3. 0. 0. 0.]
[ 0. 1. 2. 3. 4. 0. 0.]
[ 0. 0. 2. 3. 4. 5. 0.]
[ 0. 0. 0. 3. 4. 5. 6.]
[ 0. 0. 0. 0. 4. 5. 6.]
[ 0. 0. 0. 0. 0. 5. 6.]
[ 0. 0. 0. 0. 0. 0. 6.]]
遗憾的是,此代码远非最佳。