numpy 可以使用整数或布尔值索引部分分配数组,如下所示:
import numpy as np
x = np.arange(5)
x[[2,4]]=0
x
## array([0., 0., 1., 0., 1.])
x[[True]*2+[False]*3]=2
x
## array([2., 2., 1., 0., 1.])
Run Code Online (Sandbox Code Playgroud)
但是,即使x[[2,4]]在这种情况下位于左值中,也不能将左值分配给另一个变量,因为在这种情况下,分配是由进行的__setitem__,而__getitem__当传递整数或布尔值列表时,会创建一个副本:
x = np.arange(5)
y = x[[2,4]]
y[:] = 1
x
array([0., 0., 0., 0., 0.])
Run Code Online (Sandbox Code Playgroud)
问题:是否有任何简单/干净的方法来获取基于整数索引或布尔索引的索引子集的可写数组视图?“简单/干净”的意思是我要避免编写新类或自己跟踪子索引。基本上,我正在寻找一些numpy我无法使用Google的功能或技巧。
这个问题的重点是能够递归执行此操作,以便能够通过仅传递数组的视图而不是传递索引以及基本数组来创建分配给数组片段的函数。
小智 2
这里对你的问题有一个很好的解释:
您可以通过选择原始数组的一部分或更改数据类型(或两者的组合)来创建视图。创建切片视图的经验法则是,可以使用原始数组中的偏移量、步幅和计数来寻址所查看的元素。(...)
花哨的索引不返回视图的原因是,一般来说,它不能表示为切片(在上面所述的能够通过偏移量、步幅和计数来寻址的意义上)。
例如,花哨的索引 for 可以用 来表达,但不可能通过切片来为 for 做同样的事情。因此,这就是为什么返回具有原始数据副本的对象。
所以作为一般规则,不,你不能。
在我看来,处理视图的最“numpy”方式是使用掩码,并跟踪它们,而不是将视图分配给新变量。我会简单地做:
m = [2, 4]
x[m] = some_function(x[m]) # whatever you need to do
Run Code Online (Sandbox Code Playgroud)