数字区间的新值

New values for intervals of numbers

我有如下所示的 numpy 数组:

[2.20535093 2.44367784]
[7.20467093 1.54379728]
.
.
.
etc

我想获取每个数组并像这样转换它:

[1 1]
[2 0]

0 表示值低于 2。1 表示值介于 1 和 3 之间。2 表示它们高于 3。

我想为此在 python 中使用 switch case 函数。 这是我写到现在的内容:

def intervals(input):
    match input:
        case num if 0 <= num.all() < 2:
            input = 0
        case num if 2 <= num.all() < 3:
            input = 1
        case num if 3 <= num.all() <= math.inf:
            input = 2
    return input

但它似乎没有按预期工作。

不使用 switch case,你可以使用:

num = np.array([[2.20535093, 2.44367784],
             [7.20467093, 1.54379728]])
print(num)   # [[2.20535093 2.44367784], [7.20467093 1.54379728]]

num[num < 2] = 0
num[np.logical_and(num > 1, num < 3)] = 1
num[num > 3] = 2
print(num)   # [[1 1], [2 0]]

您的前两个条件有冲突,因为一个值可能同时低于 2 并介于 1 和 3 之间。假设在这种情况下“低于 2”条件胜出,您的问题的单行解决方案可能像那样:

import numpy as np
arr = np.random.rand(5000000, 2)

new_arr = (arr > 2) + (arr > 3)

如果值高于 2,则分配 +1;如果值高于 3,则分配 +1True 被转换为 int 求和)。

该方法也比其他提议的解决方案稍快,但可读性较差。