Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算函数中数组元素的绝对值_Python_Numpy_Scipy - Fatal编程技术网

Python 计算函数中数组元素的绝对值

Python 计算函数中数组元素的绝对值,python,numpy,scipy,Python,Numpy,Scipy,我定义了一个函数 def softthresh(u, LAMBDA): if np.fabs(u) <= LAMBDA: return 0 else: return ((np.fabs(u) - LAMBDA) * u / np.fabs(u)) 跟进问题: 简单函数中的奇怪行为 def softthresh(u,LAMBDA): for i in u: if np.fabs(i)<=LAMBDA:

我定义了一个函数

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


跟进问题:

简单函数中的奇怪行为

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)
def软阈值(u,λ):
对于我在u:

如果np.fabs(i)如果
u
是一个数组,则需要在函数中遍历它的所有元素

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
成为数组的一个元素,并使用如下循环调用它:

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

0
0
0
1.0
2.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))  
def软阈值(u,λ):
对于我在u:

如果np.fabs(i)您正在从内部循环调用
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

要进入if块,您希望u中的所有元素的绝对值小于λ,还是仅其中一个元素?您不明白错误消息吗?它不能评估
np.fabs(u)的结果实际上,我希望它像函数一样工作。if语句应该检查每个数组元素(即x值),并将结果(y值)作为数组给出。但是我还是不明白它><请参见下面的答案好的,这很有帮助。非常感谢。但是有没有一种方法可以像在matlab中那样实现呢。a=数组,f=函数,b=解\数组:f(a)=b?这在我的函数中是可能的吗?@user5437072你可以像在你原来的帖子中一样调用它-
yy=softthreshold(xx,ll)
。还是我没有正确理解你的后续问题?@mtrw这真的不应该是
np.where
,而是一个简单的条件:
notzero=np.fabs(u)>LAMBDA