微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用链式掩码替换 numpy 数组元素

如何解决用链式掩码替换 numpy 数组元素

考虑一些数组 arr 和高级索引掩码 mask

import numpy as np

arr = np.arange(4).reshape(2,2)
mask = A < 2

使用高级索引创建数组的新副本。因此,不能用额外的掩码甚至基本的切片操作来“链接”掩码以替换数组的元素:

submask = [False,True]
arr[mask][submask] = -1  # chaining 2 masks
arr[mask][:] = -1  # chaining a mask with a basic slicing operation

print(arr)
[[0 1]
 [2 3]]

我有两个相关的问题:

1/ 使用链式掩码替换数组元素的最佳方法是什么?

2/ 如果高级索引返回一个数组的副本,为什么下面的工作有效?

arr[mask] = -1

print(arr)
[[-1 -1]
 [ 2  3]]

解决方法

几个好问题!我的看法:

  1. 我会做这样的事情:
x,y=np.where(mask)
arr[x[submask],y[submask]] = -1
  1. 来自official document

以下大部分示例展示了在引用数组中的数据时索引的使用。这些示例在分配给数组时也能正常工作。有关作业如何工作的具体示例和说明,请参阅最后的部分。

这意味着 arr[mask]=1 正在引用,而 arr[mask] 正在提取数据并创建副本。

,

简短的回答:

  • 你必须想办法组合面具。由于面具可以以不同的方式“链接”,我认为没有简单的通用替代品。

  • 索引可以是 __getitem__ 调用,也可以是 __setitem__。你的最后一个案例是一个集合。

通过链式索引,a[mask1][mask2] =value 被翻译成

a.__getitem__(mask1).__setitem__(mask2,value)

a 是否被修改取决于第一个 getitem 生成的内容(视图与副本)。

In [11]: arr = np.arange(4).reshape(2,2)
In [12]: mask = arr<2
In [13]: mask
Out[13]: 
array([[ True,True],[False,False]])
In [14]: arr[mask]
Out[14]: array([0,1])

使用列表或数组进行索引可能会保留维数,但像这样的布尔值会返回一个一维数组,即掩码为真的项目。

在您的示例中,我们可以调整 mask(详细信息可能因第二个掩码的意图而异):

In [15]: mask[:,0]=False
In [16]: mask
Out[16]: 
array([[False,False]])
In [17]: arr[mask]
Out[17]: array([1])
In [18]: arr[mask] += 10
In [19]: arr
Out[19]: 
array([[ 0,11],[ 2,3]])

或者掩码的逻辑组合:

In [26]: (np.arange(4).reshape(2,2)<2)&[False,True]
Out[26]: 
array([[False,False]])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。