【问题标题】:Is there function available in Numpy / Python, which provide output of ALL SATISFIED CONDITIONS (not 1st satisfied condition as given by np.select)?Numpy / Python中是否有提供所有满足条件的输出(不是np.select给出的第一个满足条件)的功能?
【发布时间】:2021-10-06 06:09:46
【问题描述】:

我是 Python / Numpy 的新手。目前,我正在编写代码来评估条件列表中的最佳条件/条件(条件列表中给出了多个条件)。

我知道 Numpy Select 函数,它根据条件返回从选择列表中的元素中提取的数组。

https://numpy.org/doc/stable/reference/generated/numpy.select.html

语法:numpy.select(condlist,choicelist, default = 0)

参数:

condlist : [list of bool ndarrays] 它确定从选择列表中的哪个数组获取输出元素。当满足多个条件时,使用 condlist 中遇到的第一个条件。 choicelist : [list of ndarrays] 从中获取输出元素的数组列表。它必须与 condlist 的长度相同。 默认值:[标量,可选] 当所有条件评估为 False 时插入到输出中的元素。

Return : [ndarray] 根据条件从选择列表中的元素中提取的数组。

通过使用 Numpy Select 函数,当满足多个条件时,使用 condlist 中遇到的第一个。

问题:

Numpy / Python 中是否有可用的函数,它提供来自 condlist 的 ALL SATISFIED CONDITIONS(不是 Numpy Select 函数提供的第一个满足条件)的输出?

如果这样的功能不可用,有人可以帮助构建这样的功能吗?

示例:

df = pd.DataFrame({"A": [10, 10, 20, 20], "B": [10, 0, 10, 0]})

condlist = [(df.A + df.B == 20), (df.A == 10) & (df.B == 0), (df.A == 20) & (df.B == 10), (df.A == 20) & (df.B == 0)]

choicelist = [(df.A + df.B), 'No', 'Hi', 'YES']

calculate = np.select(condlist, choicelist)

df['RESULT'] = pd.Series(calculate, index=df.index)

df

输出:

A B RESULT
0 10 10 20
1 10 0 No
2 20 10 Hi
3 20 0 20 # Desire Output: 20, YES

最后一个原始的,期望结果输出应该是 20, YES(作为条件 #4 (df.A == 20) & (df.B == 0) 也是 TRUE)。

参考: Numpy Select 源代码超链接如下。详情请参阅第 626 至 719 行。

https://github.com/numpy/numpy/blob/v1.21.0/numpy/lib/function_base.py#L626-L719

感谢您的考虑和支持。

热烈的问候,

Keyush

【问题讨论】:

  • 这个输出会是什么样子?多个数组?参差不齐的阵列? np.select 返回一个数组,其中包含从选项中提取的值。当您想要一个在不同维度上大小不同的结果时,您极不可能找到numpy 函数。快速编译的代码是围绕常规多维数组的概念设计的——就像在输入和输出中一样。
  • df = pd.DataFrame({"A": [10, 10, 20, 20], "B": [10, 0, 10, 0]}) 结果 = np.select( [(df.A + df.B == 20), (df.A == 10) & (df.B == 0), (df.A == 20) & (df.B == 10), (df.A == 20) & (df.B == 0)], [(df.A + df.B), 'No', 'No', 'YES']) df['RESULT'] = pd.Series(result, index=df.index) df Output: Last raw, RESULT output should be 20, YES (as condition #4 (df.A == 20) & (df.B == 0) also TRUE) . Numpy / Python 中是否有可用的函数,它提供来自 condlist 的 ALL SATISFIED CONDITIONS 的输出?如果这样的功能不可用,你能帮助构建这样的功能吗?
  • 如果这是pandas 问题,请添加正确的标签。并将这样的代码放在问题中。 cmets 中的格式丢失。
  • 我意识到格式问题。因此,我刚刚更新了我的原始问题并添加了示例。我很抱歉,因为我是这个网页的新手。

标签: python arrays list numpy indexing


【解决方案1】:

这样的事情会起作用吗?

import numpy as np
def myselect(A, B):
    conditions = [lambda x,y: x == y,
                  lambda x,y: (x ==20) & (y == 20),
                  lambda x,y: x + y == 20,
                  ...
                 ]
    # These are the desired output for each satisfied condition
    result_values = ['0isTrue', '1isTrue' ...]
    assert len(conditions) == len(result_values)
    assert len(A) == len(B)
    C = [] * len(A)
    for i in range(len(conditions)):
        r = conditions[i](x, y)
        for j, v in enumerate(r):
            if v:
                C[j].append(result_values[i])
    return C

# Generate a bunch of values to test with
top = <top-value-to-generate>
elements = <number-of-elements-to-test>
rng = np.random.default_rng()
A = rng.integers(0, top, elements)
B = rng.integers(0, top, elements)
result = myselect(A, B)

注意事项:

  • 输出将是“参差不齐的”(不同数量的二维值),因此它不适合作为 numpy 数组,因此不适合在 NumPy 中。此外,您的示例在 result_values 中显示了混合的 strint,这也不是真正的 NumPy 友好。所以我为 C 使用了一个列表列表。
  • 也许有一种方法可以减少循环次数。但与编写代码一样:首先使其正确,然后使其快速。
  • lambdas(您可以使用函数代替)一次评估一个。 np.select 似乎采用了预先评估的条件列表。因此,当elements 非常大时,此解决方案可能会使用较少的内存。
  • 您可以将pass conditionsresult_values 转换为myselect

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2021-12-07
    • 2018-05-05
    相关资源
    最近更新 更多