我定义了一个函数
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)
我得到的不是我所期望的。对于u(= xx)小于5的数组元素,我应该得到零。但我没有。为什么呢?
答案 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