如何引用NumPy数组的切片/视图

4

我之前给出的一个回答在此处引发了我的一个问题:是否可能在不重复一堆括号的情况下引用numpy数组的视图或切片?

例如,在我的答案中,我使用了s=np.argsort(u),然后在“虚拟”排序的u[s]上进行了所有计算。 我遇到过这样的情况,需要该数组的布尔掩码,得到类似于u[s][mask]的东西。 对于更大的数据,我可能会有一个掩码的掩码的掩码......直到事情开始看起来像Scooby Doo的结尾。

但是,如果我将该数组分配给变量b=a[s][mask]并更改b,则a不会更改,因此我最终需要在我的计算中携带一堆括号。 我尝试过各种排列uv=u.view()[s],但似乎.view()只能创建整个数组的视图。 我是否错过了其他方法?


问题出在 [mask] 上。由于它创建了数组 a 的任意子集,因此它总是返回一个新的数组,而不是视图。你能否避免一开始就创建掩码? - Mad Physicist
1个回答

2

你可能无法解决u[s]这个简单的情况,但在更复杂的情况下,例如u[s][mask],你可以:

t = s[mask]
u[t] # same as u[s][mask]

也就是说,你可以将你的掩码简化为一个变量,但是除非你想编写自己的包装类并使用__getitem____setitem__方法,否则可能无法完全摆脱它。


1
但是如果我只有掩码呢?我猜我可以做 t=np.indices(u.shape)[mask1][mask2][mask3]。 我假设这最终是“pandas”所遇到的同样的问题,在某些抽象层面上很难区分切片和副本,除非使用.loc之类的东西进行区分。 - Daniel F
@DanielForsman:是的。在你的问题中,你提到了s=np.argsort(u),它不是一个掩码,而是一个索引数组。我基于这个假设进行了工作。如果你有很多掩码,你可以组合它们,然后只在原始数组上使用组合版本。 - John Zwinck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接