我想选择数组中的某些元素并根据这些值执行加权平均计算。但是,使用过滤条件会破坏阵列的原始结构。arr
的形状(2, 2, 3, 2)
被转换成一维数组。这对我毫无用处,因为不是所有这些元素都需要在以后相互组合(而是它们的子数组)。我怎样才能避免这种扁平化?
>>> arr = np.asarray([ [[[1, 11], [2, 22], [3, 33]], [[4, 44], [5, 55], [6, 66]]], [ [[7, 77], [8, 88], [9, 99]], [[0, 32], [1, 33], [2, 34] ]] ])
>>> arr
array([[[[ 1, 11],
[ 2, 22],
[ 3, 33]],
[[ 4, 44],
[ 5, 55],
[ 6, 66]]],
[[[ 7, 77],
[ 8, 88],
[ 9, 99]],
[[ 0, 32],
[ 1, 33],
[ 2, 34]]]])
>>> arr.shape
(2, 2, 3, 2)
>>> arr[arr>3]
array([11, 22, 33, 4, 44, 5, 55, 6, 66, 7, 77, 8, 88, 9, 99, 32, 33,
34])
>>> arr[arr>3].shape
(18,)
看看
arr>3
:arr[arr>3]
选择掩码为True
的元素。你希望这个选择有什么样的结构或形状?公寓是唯一有意义的东西,不是吗?arr
本身没有改变。你可以把不符合面具的条件归零
现在你可以在不同的维度上做加权和或平均。
np.nonzero
(或np.where
)也可能有用,为您提供所选术语的索引:签出
numpy.where
http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
为了保持相同的维度,你需要一个填充值。在下面的示例中,我使用0,但是您也可以使用
np.nan
回报
您可以考虑使用^{} 来表示满足条件的元素子集:
如您所见,遮罩阵列保留其原始尺寸。您可以分别通过
.data
和.mask
属性访问底层数据和掩码。大多数numpy函数不会考虑屏蔽值,例如:对屏蔽数组和非屏蔽数组执行按元素操作的结果也将保留屏蔽的值:
总和仅在
masked_arr
的非屏蔽值上计算-您可以通过查看masked_sum.data
来看到这一点:相关问题 更多 >
编程相关推荐