【问题标题】:How to reference a slice/view of a numpy array如何引用 numpy 数组的切片/视图
【发布时间】:2017-04-29 11:50:12
【问题描述】:

我给earlier 的回答向我提出了一个问题:是否可以在不重复一堆括号的情况下引用 numpy 数组的视图或切片?

例如,在答案中,我使用了s=np.argsort(u),然后对“虚拟”排序的u[s] 进行了所有计算。我曾经遇到过需要该数组的布尔掩码的情况,给出类似于u[s][mask] 的东西。对于更大的数据,我可能有一个 mask of a mask of a mask 。 . .直到事情开始看起来像是史酷比剧集的结尾。

但是,如果我将该数组分配给变量b=a[s][mask] 并更改ba 不会更改,因此我最终在计算中携带了一堆括号。我已经尝试过uv=u.view()[s] 的各种安排,但似乎.view() 只能查看整个数组。我还缺少另一种方法吗?

【问题讨论】:

  • 问题是[mask]。由于它生成数组a 的任意子集,因此它总是返回一个新数组,而不是视图。你能避免一开始就戴口罩吗?

标签: python arrays numpy slice


【解决方案1】:

您可能无法解决u[s] 的简单情况,但在u[s][mask] 等更复杂的情况下,您可以:

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

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

【讨论】:

  • 但是如果我只有口罩呢?我想我可以做到t=np.indices(u.shape)[mask1][mask2][mask3]。我认为它最终会成为同样的问题pandas 在某个抽象层很难区分切片和副本之间的区别,而没有像 .loc 这样的东西来区分
  • @DanielForsman:是的。在您的问题中,您提到了 s=np.argsort(u) 这不是掩码,而是索引数组。我从那个假设开始工作。如果您有很多掩码,您可以组合它们并在原始数组上使用组合版本。
猜你喜欢
  • 2017-06-24
  • 2015-01-21
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多