如何解决用链式掩码替换 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]]
解决方法
几个好问题!我的看法:
- 我会做这样的事情:
x,y=np.where(mask)
arr[x[submask],y[submask]] = -1
以下大部分示例展示了在引用数组中的数据时索引的使用。这些示例在分配给数组时也能正常工作。有关作业如何工作的具体示例和说明,请参阅最后的部分。
这意味着 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 举报,一经查实,本站将立刻删除。