评估函数中数组元素的绝对值

时间:2015-10-12 14:15:05

标签: python numpy scipy

我定义了一个函数

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

unumpy数组,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)

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

3 个答案:

答案 0 :(得分:0)

如果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

答案 1 :(得分:0)

你的问题取决于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))  

通过&lt; = logic和numpy.array定义的依赖关系得到数组。

答案 2 :(得分:0)

您正在内循环内部调用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