是否可以 Pandas 向量化涉及切片数据范围条件的操作?
Is it possible to Pandas vectorize for operation involving a condition of a range of slice data?
在此操作中,array
被分割成 range
。
这样,给定数组
arr = np.array([.1, .11, .21, .01, .5, .7, .91, .92, .95, .96, .1, .21, .23, .6, .7, .71, .72, .95, 0.96, 0.97])
和一系列值,
步骤 1
drange = np.arange(start_, end_)
切片如下
第 2 步
select_val = arr[drange]
然后 select_val
检查大于阈值的值,th
。
步骤 3
bool_data = select_val<th
最后,使用 argmin
到 return 沿轴的最小值索引。
第 4 步
doutput = np.argmin(bool_data)
在我的例子中,变量 start_
、end_
存储在 Pandas 数据帧中:
df = pd.DataFrame(dict(s=[1, 10], e=[12, 19]))
然而,arr 是 Numpy
类型。
目前,我将 Pandas' apply
用于压缩所有步骤 1-4 的函数:
def fx(arr, st, en, th):
return np.argmin(arr[np.arange(st, en)] < th)
但是,是否可以改用 向量化 方法?
当前策略代码如下:
def fx(arr, st, en, th):
return np.argmin(arr[np.arange(st, en)] < th)
th = 0.9
np.random.seed(0)
arr = np.array([.1, .11, .21, .01, .5, .7, .91, .92, .95, # 8 select 6 range: 1-12
.96, .1, .21, .23, .6, .7, .71, .72, .95, 0.96, 0.97]) # Select 15 range 10-17
df = pd.DataFrame(dict(s=[1, 10], e=[12, 19]))
df['opt'] = df.apply(lambda x: fx(arr, x['s'], x['e'], th), axis=1)
NumPy 广播
m1 = arr[:, None] > th
ix = np.arange(len(arr))[:, None]
m2 = (ix >= list(df.s)) & (ix < list(df.e))
df['opt'] = np.argmax(m1 & m2, axis=0) - df.s
结果
s e opt
0 1 12 5
1 10 19 7
另一种选择,虽然不是矢量化,
df['opt'] = df.apply(
lambda x: np.argmin(arr[x['s']:x['e']] <th), axis=1)
但是,潜在的问题是很难处理这种形式的异常错误。
在此操作中,array
被分割成 range
。
这样,给定数组
arr = np.array([.1, .11, .21, .01, .5, .7, .91, .92, .95, .96, .1, .21, .23, .6, .7, .71, .72, .95, 0.96, 0.97])
和一系列值,
步骤 1
drange = np.arange(start_, end_)
切片如下
第 2 步
select_val = arr[drange]
然后 select_val
检查大于阈值的值,th
。
步骤 3
bool_data = select_val<th
最后,使用 argmin
到 return 沿轴的最小值索引。
第 4 步
doutput = np.argmin(bool_data)
在我的例子中,变量 start_
、end_
存储在 Pandas 数据帧中:
df = pd.DataFrame(dict(s=[1, 10], e=[12, 19]))
然而,arr 是 Numpy
类型。
目前,我将 Pandas' apply
用于压缩所有步骤 1-4 的函数:
def fx(arr, st, en, th):
return np.argmin(arr[np.arange(st, en)] < th)
但是,是否可以改用 向量化 方法?
当前策略代码如下:
def fx(arr, st, en, th):
return np.argmin(arr[np.arange(st, en)] < th)
th = 0.9
np.random.seed(0)
arr = np.array([.1, .11, .21, .01, .5, .7, .91, .92, .95, # 8 select 6 range: 1-12
.96, .1, .21, .23, .6, .7, .71, .72, .95, 0.96, 0.97]) # Select 15 range 10-17
df = pd.DataFrame(dict(s=[1, 10], e=[12, 19]))
df['opt'] = df.apply(lambda x: fx(arr, x['s'], x['e'], th), axis=1)
NumPy 广播
m1 = arr[:, None] > th
ix = np.arange(len(arr))[:, None]
m2 = (ix >= list(df.s)) & (ix < list(df.e))
df['opt'] = np.argmax(m1 & m2, axis=0) - df.s
结果
s e opt
0 1 12 5
1 10 19 7
另一种选择,虽然不是矢量化,
df['opt'] = df.apply(
lambda x: np.argmin(arr[x['s']:x['e']] <th), axis=1)
但是,潜在的问题是很难处理这种形式的异常错误。