尝试根据一列中的值屏蔽2D numpy数组

时间:2013-04-02 20:18:00

标签: python numpy

我有以下数组:

[[    6.           105.             2.             8.09841881]
[    6.           105.             4.             9.34220351]
[    6.           105.             6.             9.97663435]
[    6.          1001.             2.             9.57108242]
[    6.          1001.             4.            12.22355794]
[    6.          1001.             6.            13.57295942]
[   12.          1001.             2.            12.37474466]
[   12.          1001.             4.            17.45334004]
[   12.          1001.             6.            19.88499289]
[   18.          1007.             2.            16.09076561]
[   18.          1007.             4.            23.43742275]
[   18.          1007.             6.            27.73041646]]

我试图仅提取第一个元素为6的行

print ma.MaskedArray(a, mask=(np.ones_like(a)*(a[:,0]==6.0)).T)

我从问题" mask a 2D numpy array based on values in one column&#34 ;.但是,我得到了

File "./Prova.py", line 170, in <module>
print ma.MaskedArray(a, mask=(np.ones_like(a)*(a[:,0]==6.0)).T)
ValueError: operands could not be broadcast together with shapes (12,4) (12)

你是否知道为什么这不起作用?

这个问题可能很愚蠢,但是因为我刚刚开始编程python,所以请耐心等待。 : - )

1 个答案:

答案 0 :(得分:4)

设置一些测试数据:

>>> a = np.arange(12*4).reshape((12,4))

首先,我们为掩码数组“分配”空间:

>>> mask = np.empty(a.shape,dtype=bool)

现在我们无法直接从a == 6的第一列分配到它,因为它们不是正确的形状:

>>> mask[:,:] = a[:,0] == 6
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (12,4) (12) 

但是我们可以通过简单地插入一个新轴来将我们的第一列a广播到正确的形状,以便它成为一个二维数组:

>>> mask[:,:] = (a[:,0] == 6)[:,np.newaxis]

我们可以看到,我们的面具现在是正确的。

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

现在我们制作蒙面阵列并坐下来欣赏:)。

>>> ma.MaskedArray(a,mask=mask)
masked_array(data =
 [[-- -- -- --]
 [-- -- -- --]
 [-- -- -- --]
 [-- -- -- --]
 [-- -- -- --]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]
 [32 33 34 35]
 [36 37 38 39]
 [40 41 42 43]
 [44 45 46 47]],
             mask =
 [[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [False False False False]
 [False False False False]
 [False False False False]
 [False False False False]
 [False False False False]
 [False False False False]
 [False False False False]],
       fill_value = 999999)