【问题标题】:Setting numpy slice in lambda function在 lambda 函数中设置 numpy 切片
【发布时间】:2010-12-25 01:08:57
【问题描述】:

我想创建一个 lambda 函数,它接受两个 numpy 数组并将第一个切片设置为第二个,并返回新设置的 numpy 数组。

考虑到你不能在 lambda 函数中赋值,有没有办法做类似的事情?

这里的上下文是我想在一行中将 zeros 数组的中心设置为另一个数组,而我能想出的唯一解决方案是使用 reduce 和 lambda 函数。

即我正在考虑浓缩这个(给定 b 的地方):

a = numpy.zeros( numpy.array(b.shape) + 2)
a[1:-1,1:-1] = b

成一行。这可能吗? 这只是oneliners中的一个练习。我有代码做我想做的事,我只是想知道它的乐趣:)。

【问题讨论】:

  • a[1:-1,1:-1] 替换为a[[slice(1,-1)]*a.ndim] 以支持a.ndim != 2numpy.putnumpy.place 等允许就地更改数组。
  • 这听起来很复杂,如果您关心“pythonic”,您可能不应该使用 lambda。 lambda 被限制在一行的原因正是因为它很容易被它们忘掉。没有其他技术原因。

标签: python lambda numpy


【解决方案1】:

这很难看;你不应该使用它。但它是你所问的单行 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()

Python 中的 Y 组合器

这是On writing Python one-liners 的博客文章,它展示了如何使用lambdas 编写无名递归函数(链接由@Peter Hansen 建议)。

【讨论】:

  • 嗯,这绝对是我想要的。你能给我关于这个“setitem”方法的任何信息吗?我似乎无法在文档中找到它。根据文档,据我所知,“numpy.put”会使数组变平。谢谢!
  • 在我看来: print numpy.zeros( (10,10) ).__setitem__( numpy.s_[1:-1,1:-1] , numpy.arange(64).reshape (8,8) ) 应该打印出一个 10x10 数组,中心 8x8 为 arange(64)。但是它只是打印出“无”。这可能是非常难以理解的,哈哈。错误在哪里?如果我分多个步骤,Python 不介意执行所有这些步骤。所以这可能是我的错。
  • 您可能希望将此链接添加到响应中:blog.sigfpe.com/2008/09/on-writing-python-one-liners.html
  • @VolatileStorm:我添加了有关__setitem__ 的信息。
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多