我想基于两个输入数组(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上,以便我可以利用算法差异化优势。)
答案 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