参考链接: Boolean or “mask” index arrays
说明:通过逻辑判断符号可以得到一个mask掩码,其值是True或者False,并且维度和原来的多维数组相同.使用mask来索引得到的是一个一维数组,筛选出True位置对应的元素.通过mask掩码就可以对原多维数组进行修改.但是如果将mask筛选出的内容赋值给一个变量的话,无法通过这个变量来修改原来的多维数组,他们互不影响.
实验1:
(base) PS C:\Users\chenxuqi> python
Python 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> z = np.arange(12).reshape(3,4)
>>> z
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> mask4cxq = z > 6
>>> mask4cxq
array([[False, False, False, False],
[False, False, False, True],
[ True, True, True, True]])
>>> z[mask4cxq]
array([ 7, 8, 9, 10, 11])
>>> a = z[mask4cxq]
>>> a
array([ 7, 8, 9, 10, 11])
>>> z
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[0] = 20200910
>>> a
array([20200910, 8, 9, 10, 11])
>>> z
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> z[mask4cxq] = 8888888
>>> z
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 8888888],
[8888888, 8888888, 8888888, 8888888]])
>>> a
array([20200910, 8, 9, 10, 11])
>>>
>>>
实验2: 掩码mask与整数索引混合使用
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> import numpy as np
>>> z = np.arange(12).reshape(3,4)
>>> z
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> mask4cxq = z > 6
>>> mask4cxq
array([[False, False, False, False],
[False, False, False, True],
[ True, True, True, True]])
>>> z[mask4cxq]
array([ 7, 8, 9, 10, 11])
>>> z[mask4cxq] = 20200910
>>> z
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 20200910],
[20200910, 20200910, 20200910, 20200910]])
>>> z[z < 4] = 888
>>> z
array([[ 888, 888, 888, 888],
[ 4, 5, 6, 20200910],
[20200910, 20200910, 20200910, 20200910]])
>>>
>>>
>>>
>>> z = np.arange(12).reshape(3,4)
>>> z
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> z[...,0][z[...,0] > 1] = 20200910 # 只修改某一列
>>> z
array([[ 0, 1, 2, 3],
[20200910, 5, 6, 7],
[20200910, 9, 10, 11]])
>>>
>>>
>>> z = np.arange(12).reshape(3,4)
>>> z
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> z[z[...,1]>4]
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> z[z[...,1]>4,1]
array([5, 9])
>>> # 只修改某一列
>>> z[z[...,1]>4,1] = 20200910
>>> z
array([[ 0, 1, 2, 3],
[ 4, 20200910, 6, 7],
[ 8, 20200910, 10, 11]])
>>>
>>> z = np.arange(12).reshape(3,4)
>>> z
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> z[..., 1:][z[..., 1:]<10] = 20200910
>>> z
array([[ 0, 20200910, 20200910, 20200910],
[ 4, 20200910, 20200910, 20200910],
[ 8, 20200910, 10, 11]])
>>>
>>>
>>>