gpt4 book ai didi

python - 如果满足条件,则用最接近的元素替换 Numpy 元素

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:21 25 4
gpt4 key购买 nike

我有一个大的 numpy 数组,我需要对其进行操作,以便每个元素都在一定范围内。

我可以识别无效的元素

v[np.where(v>upper_lim)]
v[np.where(v<lower_lim)]

或更简单地说:

v[v>upper_lim]
v[v<lower_lim]

现在我想用满足条件的最接近(较早)的可用样本替换满足此条件的每个元素。

例如

upper_lim=10
lower_lim=1
v=[1,-77,3,4,5,13213,6,7,8,1024]

应该给予

v=[1,1,3,4,5,5,6,7,8,8]

当无效值之前没有可用元素时,我需要用下一个有效元素替换

所以

upper_lim=10
lower_lim=1
v=[-7,1,2,3,-77]

应该给予

v=[1,1,2,3,3]

使用 pandas 的可能解决方案:

import pandas as pd
v=pd.DataFrame(v)
v[v>ul]=np.nan
v[v<ll]=np.nan
v=v.fillna(method='ffill').fillna(method='bfill')
v=v.flatten()

但是使用 pandas 对我来说不是一个选择

最佳答案

pandas 具有填充能力,这正是您所描述的,但您必须将数组转换为 float ,因为 numpy int 数组无法保存 np.nan 值。

import pandas as pd
import numpy as np

upper = 10
lower = 1
v=np.array([1,-77,3,4,5,13213,6,7,8,1024])
s = pd.Series(v)
s[~((s>lower) & (s<upper))] = np.nan
s = s.fillna(method='pad')
# at this point the series is padded but the values are floats instead of
# ints, you can cast back to an int array if you wish

v2 = s.values.astype(int)
v2
# outputs:
array([1, 1, 3, 4, 5, 5, 6, 7, 8, 8])

更新:

一个只有 numpy 的解决方案

# first we identify elements that are out of bounds and need to be filled from the data
mask = (v<lower) | (v>upper)
oob = np.where(mask)[0]

# for each oob value, we calculate the index that provides the fill-value using a forward fill or backward fill
def fillidx(i, mask_oob):
try:
if i == 0 or np.all(mask_oob[:i]):
# all elements from start are oob
raise IndexError()
n = -1 * (1 + np.argmin(mask_oob[:i][::-1]))
except (IndexError):
n = 1 + np.argmin(mask_oob[i+1:])
return i + n


fill = [fillidx(i, mask) for i in oob]
v[mask] = v[fill]
print(v)

对于第一个测试数组v = np.array([1,-77,3,4,5,13213,6,7,8,1024]),输出如下:

[1 1 3 4 5 5 6 7 8 8]

第二个测试数组 v = np.array([-7,1,2,3,-77]) 输出如下:

[1 1 2 3 3]

一个数组,其中连续值超出范围,前几个元素也超出范围,即 v = np.array([-200,20,1,-77,3,4,5 ,13213,-200,6,7,8,1024]) 我们得到以下输出:

[1 1 1 1 3 4 5 5 5 6 7 8 8]

关于python - 如果满足条件,则用最接近的元素替换 Numpy 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48584403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com