我想创建一个lambda函数,该函数接受两个numpy数组并将第一个切片设置为第二个并返回新设置的numpy数组。
考虑到你无法在lambda函数中分配东西,有没有办法做类似的事情呢?
这个的上下文是我想在一行中将零数组的中心设置为另一个数组,而我能想到的唯一解决方案是使用reduce和lambda函数。
即。我正在考虑这种情况的凝结(给出b):
a = numpy.zeros( numpy.array(b.shape) + 2)
a[1:-1,1:-1] = b
成一行。这可能吗? 这只是oneliners的练习。我有代码做我想做的事情,我只是想知道它的乐趣:)。
答案 0 :(得分:4)
这很丑陋;你不应该使用它。但正如你所问,它是oneline lambda:
f = lambda b, a=None, s=slice(1,-1): f(b, numpy.zeros(numpy.array(b.shape) + 2))\
if a is None else (a.__setitem__([s]*a.ndim, b), a)[1]
__setitem__
? obj.__setitem__(index, value)
相当于obj[index] = value
。例如:
class A:
def __setitem__(self, index, value):
print 'index=%s, value=%s' % (index, value)
a = A()
a[1, 2] = 3
打印:
index=(1, 2), value=3
__setitem__()
会返回无? Python中有一个通用惯例,即list.extend()
,list.append()
等就地修改对象的方法应该返回None
。有例外,例如list.pop()
。
以下是博文On writing Python one-liners,其中显示了如何使用lambda
编写无名递归函数(该链接由@Peter Hansen建议)。