【问题标题】:Evaluate absolute value of array element in function计算函数中数组元素的绝对值
【发布时间】:2015-10-13 01:53:28
【问题描述】:

我定义了一个函数

def softthresh(u, LAMBDA):
    if np.fabs(u) <= LAMBDA:
        return 0
     else:
        return ((np.fabs(u) - LAMBDA) * u / np.fabs(u))   

u 是一个numpy 数组,np.fabs 将检查每个数组元素(np.fabs(u_i)) 的关系。它给了我以下错误:

 The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()


跟进问题:

简单函数中的奇怪行为。

def softthresh(u,LAMBDA):
    for i in u:
        if np.fabs(i)<=LAMBDA:
            return 0
        else:
            return ((np.fabs(i)-LAMBDA)*u/np.fabs(i)) 
   ll = 5.0
   xx = np.arange(-10,11)
   yy = softthresh(xx,ll)

我得到的不是我所期望的。对于小于 5 的 u (=xx ) 数组元素,我应该得到零。但我没有。为什么?

【问题讨论】:

  • 进入 if 块,你是想让 u 中的所有元素的绝对值都小于 lambda,还是只选择其中一个?
  • 你看不懂错误信息吗?它无法在布尔上下文中评估 np.fabs(u) &lt;= LAMBDA 的结果,因为它不确定您的意思。您能否提供一些示例输入和输出/
  • 实际上,我希望它像一个函数一样工作。 if 语句应该检查每个数组元素(即 x 值)并将结果(y 值)作为数组给出。

标签: python numpy scipy


【解决方案1】:

您正在从内部循环内部调用return。因此,您的函数在计算 u 的第一个成员后立即返回。

由于您使用的是 NumPy,因此您应该利用 NumPy 一次对整个数组进行操作的能力,以及 NumPy 的智能索引。

def softthreshold(u, LAMBDA):
    notzero = np.fabs(u) > LAMBDA # find the indeces of elements that need to be scaled
    rr = np.zeros_like(u) # an array the same size/type as u, already initialized to 0
    rr[notzero] = (np.fabs(u[notzero])-LAMBDA)*u[notzero]/np.fabs(u[notzero]) # scale each of the members that aren't zero
    return rr

【讨论】:

  • 好的,这很有帮助。谢谢你。但是有没有办法像在matlab中那样做。 a= 数组,f=函数,b=solution_array: f(a)=b ?我的这种功能有可能吗?
  • @user5437072 您可以像在原始帖子中一样调用它 - yy = softthreshold(xx,ll)。还是我没有正确理解您的后续问题?
  • @mtrw 这不应该是np.where,而是一个简单的条件:notzero = np.fabs(u) &gt; LAMBDA
【解决方案2】:

您的问题取决于 numpy 数组。如果您使用的是列表,它会起作用。

否则,如果您需要 numpy 数组,您可以使用类似

的代码
def softthresh(u,LAMBDA):
for i in u:
    if np.fabs(i)<=LAMBDA:
        return 0
    else:
        return ((np.fabs(u)-LAMBDA)*u/np.fabs(u))  

你通过

【讨论】:

    【解决方案3】:

    如果u 是一个数组,你需要在你的函数中遍历它的所有元素。

    或者,您可以让 u 成为数组的一个元素,并使用这样的循环调用它:

    tbl = np.array([1, 2, 3, 4, 5])
    for elt in tbl:
        print(softthresh(elt, 3))
    

    结果是:

    0
    0
    0
    1.0
    2.0
    

    【讨论】:

    • 我还是不明白>.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    相关资源
    最近更新 更多