首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python代码-how,用于在尝试查找子集时更改某个范围内的数组的每个元素

Python代码-how,用于在尝试查找子集时更改某个范围内的数组的每个元素
EN

Stack Overflow用户
提问于 2021-04-08 01:49:34
回答 4查看 65关注 0票数 1

我想检查一个数组(exp1exp2exp3,..)是另一个数组sim的子集,但元素的差可以在(+-2)范围内。下面是一个例子

代码语言:javascript
运行
复制
sim = [205.46,195.93,189.6,184.01,179.23,158.31,149.07,129.27,110.87,94.524,81.518,49.244,43.926,28.643]

exp1 = [190.61, 109.5, 42.323 ] # This is a subset
exp2 = [205, 28.6]              # This is a subset
exp3 = [88]                     # This is NOT a subset
exp4=[208.14, 125.162, 186.2]   # This is NOT a subset

我发现这段代码可以很容易地找到子集,但我不知道如何包含+2到-2之间的范围。

代码语言:javascript
运行
复制
# Return 1 if arr2[] is a subset of
# arr1[]
def isSubset(arr1, arr2, m, n):
    i = 0
    j = 0
    for i in range(n):
        for j in range(m):
            if(arr2[i] == arr1[j]):
                break
        
        # If the above inner loop was
        # not broken at all then arr2[i]
        # is not present in arr1[]
        if (j == m):
            return 0

    # If we reach here then all
    # elements of arr2[] are present
    # in arr1[]
    return 1

# Driver code
if __name__ == "__main__":
    arr1 = [11, 1, 13, 21, 3, 7]
    arr2 = [11, 3, 7, 1]
    m = len(arr1)
    n = len(arr2)
    if(isSubset(arr1, arr2, m, n)):
        print("arr2[] is subset of arr1[] ")
    else:
        print("arr2[] is not a subset of arr1[]")

在我找到这样做的方法之后,我将遍历模拟数组,比如sim1,sim2,...在这里,我试图将一组模拟结果与一组实验结果进行比较,误差条在+-2以内。我很感谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-04-08 02:03:51

我认为你只需要在isSubset函数的条件语句中添加这个比较句:

代码语言:javascript
运行
复制
if (arr2[i] >= arr1[j]-2 and arr2[i] <= arr1[j]+2):
  break

您还可以使该过程更有效率:

代码语言:javascript
运行
复制
for i in range(n):
  for j in range (m):
    if (arr2[i] >= arr1[j]-2 and arr2[i] <= arr1[j]+2):
      break
    if j == m-1:
      return 0

在python中,您不需要对for循环进行任何声明,因为默认情况下,python只是从0循环到m-1。

票数 0
EN

Stack Overflow用户

发布于 2021-04-08 02:05:39

您需要稍微更改函数isSubset()

代码语言:javascript
运行
复制
# Return True if arr2[] is a subset of arr1[], with specified error
def isSubset(arr1, arr2, error):
    for a2 in arr2:
        found = False
        for a1 in arr1:
            if(abs(a1 - a2) < error):
                found = True
                break
        if not found:
            return False
    return True

我没有比较索引,而是用in遍历了数组,并保存了一个变量,检查是否在指定的error边界内找到了解决方案-对于您的示例,它是2

代码语言:javascript
运行
复制
# Driver code
if __name__ == "__main__":
    sim = [205.46,195.93,189.6,184.01,179.23,158.31,149.07,129.27,110.87,94.524,81.518,49.244,43.926,28.643]

    exp1 = [190.61, 109.5, 42.323 ] # This is a subset
    exp2 = [205, 28.6]              # This is a subset
    exp3 = [88]                     # This is NOT a subset
    exp4 = [208.14, 125.162, 186.2] # This is NOT a subset

    print(isSubset(sim, exp1, 2)) # True
    print(isSubset(sim, exp2, 2)) # True
    print(isSubset(sim, exp3, 2)) # False
    print(isSubset(sim, exp4, 2)) # False
票数 0
EN

Stack Overflow用户

发布于 2021-04-08 15:17:50

数据集有多大?如果它不是太大,你可以通过一个很酷的修改来解决它-而不是查看一个值列表,你可以从原始数据创建一个范围列表。

代码语言:javascript
运行
复制
sim = [205.46, 195.93, 189.6, 184.01, 179.23, 158.31, 149.07, 129.27, 110.87, 94.524, 81.518, 49.244, 43.926, 28.643]
exp1 = [190.61, 109.5, 42.323]
exp4 = [208.14, 125.162, 186.2]

sim_range = [(x - 2, x + 2) for x in sim]

def check_if_in_range(exp):
    for num in exp:
        if not any(r[0] <= num <= r[1] for r in sim_range):
            return False

        return True


print(check_if_in_range(exp1))
print(check_if_in_range(exp4))

输出为:

代码语言:javascript
运行
复制
True
False
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66991499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档