2017-09-26 65 views
-1

我有一点复杂的问题。我有两组数组,我们可以调用第一个数组possible_values并将第二个数组调用为boundary。第一个数组形状是(n,)数组中的每个值都是可能值的list。第二个数组形状是(n,2),其中值是(min_value,max_value)。矢量化查找来自边界的最小值索引

我想什么是最小的指数possible_values是实现从边界条件:它必须比min_value大,但它必须小于或等于max_value。这是我的问题的一个例子。

import numpy as np 
possible_values = np.array([[0.0,0.1,0.2,0.3,0.4,0.5],[0.3,0.5,0.7],[0.2,0.5,0.8]]) 
boundary = np.array([[0.1, 0.4], [0.2,0.7],[0.1,0.15]]) 

这会给我造成:

array([2, 0, None]) 

然而,这个代码是极其缓慢。有更好的建议吗?我试图看看np.minimum.reduceat,但我不知道如何在这种情况下使用它。谢谢!

+0

你有一个'boundary'阵列,并在你的榜样了'min_max'阵列,而不是一个'possible_values'阵列很好的解决方案。你的边界阵列也有怪异的形状/ dtype;没有什么比建议之前的文本(而是,'min_max'数组看起来更像是您建议的边界样式数组,'n = 3')。请确保您的示例代码是准确的并且可行。 – Evert

回答

-1

我找到这个

def padding(arr, n): 
    np.array([arr for i in range(0,n)]).T 

possible_values = np.array([[0.0,0.1,0.2,0.3,0.4,0.5[0.3,0.5,0.7,-1,-1,-1],[0.2,0.5,0.8,-1,-1,-1]]) 
boundary = np.array([[0.1, 0.4], [0.2,0.7],[0.1,0.15]]) 
start_pt = fast_tile_axis1(boundary[:,0], possible_values.shape[1]) 
end_pt = fast_tile_axis1(boundary[:,1], possible_values.shape[1]) 
is_within_range = (start_pt < possible_values) & (end_pt > 
possible_values) 
np.where(np.any(is_within_range, axis=1), np.argmax(is_within_range,axis=1), -1)