我有一个名为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
答案 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