如果为True

时间:2017-04-25 09:46:10

标签: python arrays vector filter

我有两个向量(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

有关如何访问filterTrue或其他解决方案(包含或不包含过滤器矩阵)的行/列索引的任何帮助,我们将不胜感激。

输出应为:

  [[ 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]]]

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.]]

遗憾的是,此代码远非最佳。