在 lambda 函数中设置 numpy 切片

发布于 2024-08-14 07:25:54 字数 362 浏览 1 评论 0原文

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

考虑到你不能在 lambda 函数中分配东西,有没有办法做类似的事情?

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

即我正在考虑将其压缩(其中给出了 b):

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

压缩成一行。这可能吗? 这只是单线练习。我有代码做我想做的事情,我只是想知道这个是为了它的乐趣:)。

I want to create a lambda function that takes two numpy arrays and sets a slice of the first to the second and returns the newly set numpy array.

Considering you can't assign things in lambda functions is there a way to do something similar to this?

The context of this is that I want to set the centre of a zeros array to another array in a single line, and the only solution I could come up with is to use reduce and lambda functions.

I.e. I'm thinking about the condensation of this (where b is given):

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

Into a single line. Is this possible?
This is just an exercise in oneliners. I have the code doing what I want it to do, I'm just wondering about this for the fun of it :).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寻找一个思念的角度 2024-08-21 07:25:54

这很丑陋;你不应该使用它。但正如您所问的,它是 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

Why does __setitem__() return None?

Python 中有一个通用约定,即就地修改对象的 list.extend()list.append() 等方法应返回 None< /代码>。但也有例外,例如 list.pop()

Python 中的 Y 组合器

这是博客文章 关于编写 Python one- liners 展示了如何使用 lambda 编写无名递归函数(该链接由 @Peter Hansen 建议)。

This is ugly; you should not use it. But it is oneline lambda as you've asked:

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]

What is __setitem__?

obj.__setitem__(index, value) is equivalent to obj[index] = value in this case. Example:

class A:
    def __setitem__(self, index, value):
       print 'index=%s, value=%s' % (index, value)

a = A()
a[1, 2] = 3

It prints:

index=(1, 2), value=3

Why does __setitem__() return None?

There is a general convention in Python that methods such as list.extend(), list.append() that modify an object in-place should return None. There are exceptions e.g., list.pop().

Y Combinator in Python

Here's blog post On writing Python one-liners which shows how write nameless recursive functions using lambdas (the link is suggested by @Peter Hansen).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文