为了账号安全,请及时绑定邮箱和手机立即绑定

NumPy - 分配给函数返回的视图

NumPy - 分配给函数返回的视图

12345678_0001 2023-10-05 17:48:30
假设我有NumPy ND 数组和一个返回 的任何复杂视图的a函数,以及与具有相同形状的数组。f(a)vabvb分配给的最简单方法是什么v?两者都可以是多维的。最简单的尝试(例如在下一个代码中分配给函数的返回值)失败并出现错误SyntaxError: can't assign to function call::import numpy as npa, b = np.arange(10), np.arange(2)a[2:4] = b # Workingf = lambda a: a[2:4] # Returns any view of af(a) = b # Not working, syntax error根据任务,不允许将数组b参数传递给函数f,函数本身应该是未修改的。
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞


f(a)[...] = b


查看完整回答
反对 回复 2023-10-05
?
哔哔one

TA贡献1854条经验 获得超8个赞

在尝试寻找解决方案之前,请确保您了解问题。


In [27]: a, b = np.arange(10), np.arange(2)

In [28]: f = lambda a: a[2:4]

In [29]: f(a)

Out[29]: array([2, 3])

In [30]: f(a) = b

  File "<ipython-input-30-df88b52b4d3c>", line 1

    f(a) = b

            ^

SyntaxError: can't assign to function call

这个错误是 Python 的一个基本错误。语法问题。


但是看看当我们使用索引时会发生什么。


您所做的切片f是:


In [31]: a[2:4]

Out[31]: array([2, 3])

In [32]: a.__getitem__(slice(2,4))

Out[32]: array([2, 3])

所需的分配切片是:


In [33]: a[2:4] = b

In [34]: a.__setitem__(slice(2,4),b)

In [35]: a

Out[35]: array([0, 1, 0, 1, 4, 5, 6, 7, 8, 9])

请注意,setitemtakeb作为参数。 a.__setitem__(slice(2,4))=b会遇到同样的语法错误。


这种用法setitem允许我们使用高级索引(列表):


In [38]: a[[0,2]] = b

In [39]: a.__setitem__([0,2],b)

如果这不起作用:


In [40]: a[[0,2]][...] = b

因为它实际上是a.__getitem__([0,2]).__setitem__(Ellipsis,b)。set 修改 get 生成的副本。仅当第一个索引生成view.


查看完整回答
反对 回复 2023-10-05
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我刚刚想出了一个最简单的解决方案,它适用于除 0 维数组(标量)之外的任何 ND 情况:

f(a)[:] = b


查看完整回答
反对 回复 2023-10-05
  • 3 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信