我有一个类似于“Count values in a certain range”问题的情况,但是我有一个矩阵intervals
,其中有两个列[upper, lower]
和另一个列向量true_values
。在
我想检查true_values
向量中的值是否在[upper, lower]
定义的范围内。在
如果问题的答案与4道题相关联:
((true_values >= intervals[:, 0]) & (true_values <= intervals[:, 1])).sum()
每个大于/小于检查一次,and子句一次,sum
一次。在
考虑到这些可能是巨大的矩阵,我想知道是否有可能减少必要的传递次数,理想情况下是一次间隔检查,一次求和(我认为不可避免),我在考虑类似于在intervals
'行上广播一个函数。在
下面是一个最小的例子:
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
n_samples = 2000
n_features = 10
rng = np.random.RandomState(0)
X = rng.normal(size=(n_samples, n_features))
w = rng.normal(size=n_features)
# simple linear function without noise
y = np.dot(X, w)
gbrt = GradientBoostingRegressor(loss='quantile', alpha=0.95)
gbrt.fit(X, y)
# Get upper interval
upper_interval = gbrt.predict(X)
# Get lower interval
gbrt.set_params(alpha=0.05)
gbrt.fit(X, y)
lower_interval = gbrt.predict(X)
intervals = np.concatenate((lower_interval[:, np.newaxis], upper_interval[:, np.newaxis]), axis=1)
# This is 4 passes:
perc_correct_intervals = ((y >= intervals[:, 0]) & (y <= intervals[:, 1])).sum() / y.shape[0]
np.count_nonzero
与.sum()
相比节省了一些,如果您不需要将intervals
矩阵用于其他用途,则可以节省更多相关问题 更多 >
编程相关推荐