在一个Numpy数组中一次执行多个比较(间隔)

2024-10-05 14:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似于“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]

Tags: importtruenp情况矩阵upperlower向量
1条回答
网友
1楼 · 发布于 2024-10-05 14:23:59

np.count_nonzero.sum()相比节省了一些,如果您不需要将intervals矩阵用于其他用途,则可以节省更多

%%timeit
intervals = np.concatenate((lower_interval[:, np.newaxis], upper_interval[:, np.newaxis]), axis=1);
perc_correct_intervals = ((y >= intervals[:, 0]) & (y <= intervals[:, 1])).sum() / y.shape[0]

15.7 µs ± 78.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)


%%timeit
np.count_nonzero(np.less(lower_interval, y)*np.less(y, upper_interval))/y.size

3.93 µs ± 28 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

相关问题 更多 >