【问题标题】:How can I apply a piecewise function to every element of a 2D numpy array如何将分段函数应用于 2D numpy 数组的每个元素
【发布时间】:2021-05-10 10:19:26
【问题描述】:

假设我有一个 2D numpy 数组,比如

arr = array([[0, 0.001 , 0.002], [0.03, 0.04, 0.05], [0.01, 0.002, 0.5], [0.05, 0.8, 0.003]])

我想对其执行分段函数,比如说

def gammacor(x):
    return np.piecewise(x, [x <= 0.00313, x > 0.00313], [12.92*x, 1.055*x**(1/2.4)-0.055])

gcarr = gammacor(arr)

当我这样做时,我得到一个错误:

TypeError:NumPy 布尔数组索引分配需要 0 或 1 维输入,输入有 2 维

如果我尝试在展平数组上运行该函数(计划在运行该函数后重新整形回 n x 3),我会收到错误:

ValueError: NumPy 布尔数组索引分配不能将 3 个输入值分配给掩码为 true 的 0 个输出值

有没有一种简单的方法可以将分段函数应用于 2D(或 ND)数组的所有元素?

【问题讨论】:

  • piecewise 适用于 2 或 3d 数组。但是您的函数甚至不适用于一维数组。
  • 出于某种原因,当我用一维数组调用它时它确实有效。奇怪。

标签: python numpy


【解决方案1】:

np.piecewise的第三个参数是一个funclist。

它们应该是可调用的:

import numpy as np

arr = np.array([[0, 0.001, 0.002], [0.03, 0.04, 0.05], [0.01, 0.002, 0.5],
                [0.05, 0.8, 0.003]])

p = np.piecewise(arr, [arr <= 0.00313, arr > 0.00313],
                 [lambda v: 12.92 * v,
                  lambda v: 1.055 * v ** (1 / 2.4) - 0.055])

print(p)

输出:

[[0.         0.01292    0.02584   ]
 [0.18974828 0.22091636 0.24780053]
 [0.09985282 0.02584    0.73535698]
 [0.24780053 0.90633175 0.03876   ]]

def gammacor(x):
    return np.piecewise(x, [x <= 0.00313, x > 0.00313],
                        [lambda v: 12.92 * v,
                         lambda v: 1.055 * v ** (1 / 2.4) - 0.055])


gcarr = gammacor(arr)

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 2016-08-19
    • 1970-01-01
    • 2020-08-16
    • 2017-07-24
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多