我有以下数组:
[[ 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”中得到的。但是,我得到了
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。 :-)
最佳答案
设置一些要处理的测试数据:
>>> 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)
关于python - 试图根据一列中的值屏蔽 2D numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15773570/