如何在numpy中基于searchsorted结果创建“映射”矩阵?

时间:2019-08-06 11:51:55

标签: python numpy

我想基于两个输入数组(XI和X)创建一个MxN矩阵,如果该列代表针对该行的X值(在XI内)排序的搜索结果,则每一行都有1。

代码:

import numpy as np

XI = np.array([1., 2., 4., 5., 7.])
X = np.array([6.5, 2.2, 1.4, 4., 3.7, 3.9, 0.1, 5.3, 10.2])

def bmap(xi, x):
    i = np.searchsorted(xi, x, side="right") - 1
    result_shape = (x.shape[0], xi.shape[0])
    result = np.zeros(result_shape)
    for row, column in enumerate(i):
        if -1 < column < xi.shape[0] - 1:
            result[row,column] = 1.
    return result

bmap(XI, X) 

预期输出:

array([[0., 0., 0., 1., 0.],
       [0., 1., 0., 0., 0.],
       [1., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0.]])

如何仅使用向量化操作(例如,排除i的枚举和边界检查)来执行此操作?还可以在TensorFlow中使用的东西的加分点(因为最终,我试图将其移植到TensorFlow上,以便我可以利用算法差异化优势。)

1 个答案:

答案 0 :(得分:2)

如果我了解您只想将索引i转换为数组中的位置(每行一个),除非该索引为负数或在最后一列中。

i = np.searchsorted(xi, x, side="right") - 1
# array([ 3,  1,  0,  2,  1,  1, -1,  3,  4], dtype=int64)

创建您的输出数组和有效值的掩码:

out=np.zeros([x.size, xi.size])
valid = (i>-1)&(i<xi.shape[0] - 1)
#valid: array([ True,  True,  True,  True,  True,  True, False,  True, False])

使用valid掩码为行建立索引,而i(在有效时)用作列的索引:

out[valid, i[valid]] = 1