如何使用python的map lambda将元素设为某个数字?

时间:2015-02-26 14:35:34

标签: python numpy dictionary lambda

我有一个名为p2De的numpy.array。第一行有多个元素可能大于1.我想设置小于1到1的元素。以下是我的代码,但显示错误...为什么?如何解决?

bounde=1
p2De[:0]=map(lambda x:bounde if (x < bounde),p2Di[:0])

  File "C:\Users\wange\workspace\cathode\src\diffusion.py", line 86
    p2De[:0]=map(lambda x:bounde if (x < bounde),p2Di[:0])
                                                ^
SyntaxError: invalid syntax

4 个答案:

答案 0 :(得分:1)

您需要为else功能指定lambda

lambda x:bounde if (x < bounde) else #stuff

答案 1 :(得分:1)

应该是

lambda x:bounde if (x < bounde) else x

您还可以使用更易读的列表理解。另外,我会使用max内置函数而不是lambda:

p2De[:0] = [max(x, bounde) for x in p2Di[:0]]

答案 2 :(得分:1)

正如其他人所说,语法问题出现在lambda

我认为你不想p2De[:0] - 这是一个空阵列。 p2De[0]是第1行。 p2De[0,:]是相同的,并且向人类读者清楚地表明您选择了第二列的第一行。

使用地图或理解是有效的,但它们在一个简单的循环中没有提供很多优势(如果有的话)(因为你不需要替换所有的值): / p>

for i,v in enumerate(p2De[0,:]):
    if v<1:
        p2De[0,i] = 1

但这些迭代都不是很好的numpy练习。你应该尝试用矢量运算来思考。通常的做法是使用布尔掩码(或索引)来选择应更改的值:

I = p2De[0,:]<1  # boolean vector
p2De[0, I] = 1
p2De[0,p2De[0,:]<1]=1  # or one line form

还有一个numpy函数可以应用这样的限制,np.maximum

p2De[0,:] = np.maximum(p2De[0,:], 1)

np.clip同时应用最小和最大边界:

p2De[0,:] = np.clip(p2De[0,:], minbd, maxbd)
np.clip(p2De[0,:], minbd, maxbd, p2De[0,:])  # alt calling method

Python(3)老板鼓励我们对地图和lambdas使用函数和理解。例如,如果plist是一个类似p2De[0,:]行的列表:

def clip(x):
    return 1 if x<1 else x 
plist = [clip(x) for x in plist]
plist = [min(x, 1) for x in plist] # using a builtin for this simple case

答案 3 :(得分:0)

如果你有一个列表a,你可以这样做:

    a=[2,3,1,7,0,0,8]
    bounde=1
    b = map(lambda n: n if n > bounde else bounde,a)
    print b