我可以从numpy数组的布尔选择中创建视图吗?

时间:2019-04-27 11:12:36

标签: numpy

如果我创建一个numpy数组,并创建另一个作为其选择性索引:

>>> x
array([[ 2,  3,  4],
       [ 5,  6,  7],
       [ 6,  7,  8],
       [11, 12, 13]])

>>> nz
array([ True,  True, False,  True], dtype=bool)

然后直接使用nz返回原始数组的视图:

>>> x[nz,:]
array([[ 2,  3,  4],
       [ 5,  6,  7],
       [11, 12, 13]])

>>> x[nz,:] += 2
>>> x
array([[ 4,  5,  6],
       [ 7,  8,  9],
       [ 6,  7,  8],
       [13, 14, 15]])

但是,很自然地,一个作业会复制一份:

>>> v = x[nz,:]

对v的任何操作都在副本上,并且对原始数组没有影响。

有什么方法可以创建x[nz,:]的命名视图,只是为了简化代码,还是可以传递代码,因此对命名视图的操作将仅影响x的选定元素。 ?

1 个答案:

答案 0 :(得分:1)

Numpy拥有masked_array,这可能是您要查找的:

import numpy as np

x = np.asarray([[ 2,  3,  4],[ 5,  6,  7],[ 6,  7,  8],[11, 12, 13]])
nz = np.asarray([ True,  True, False,  True], dtype=bool)

mx = np.ma.masked_array(x, ~nz.repeat(3)) # True means masked, so "~" is needed
mx += 2

# x changed as well because it is the base of mx 
print(x)
print(x is mx.base)