假设我生成一个值序列,按提供的范围对它们进行平铺,然后按当前行ID将每行中的每个值递增,然后对所需范围之外的某些值进行掩盖,如下所示:
>>> range = 5
>>> matrix = np.arange(-5, 10, 1)
>>> matrix = np.tile(matrix, (range, 1))
>>> matrix = np.add(matrix, np.arange(0, range)[:, None])
>>> matrix = ma.masked_outside(matrix, 0, 10)
[[-- -- -- -- -- 0 1 2 3 4 5 6 7 8 9]
[-- -- -- -- 0 1 2 3 4 5 6 7 8 9 10]
[-- -- -- 0 1 2 3 4 5 6 7 8 9 10 --]
[-- -- 0 1 2 3 4 5 6 7 8 9 10 -- --]
[-- 0 1 2 3 4 5 6 7 8 9 10 -- -- --]]
您如何最好地将上述输出转换为[non-masked value, row-id]
格式的矩阵,即:
[0,0], [1, 0], [2,0] ... [10, 4]
此外,原始代码是否太浪费了以至于无法实现最终所需的步骤?
答案 0 :(得分:0)
和你的matrix
一起玩时,我产生了这个结果:
In [50]: np.stack((matrix.compressed(), np.where(~matrix.mask)[0]),1)
Out[50]:
array([[ 0, 0],
[ 1, 0],
[ 2, 0],
[ 3, 0],
[ 4, 0],
[ 5, 0],
[ 6, 0],
[ 7, 0],
[ 8, 0],
[ 9, 0],
....
我们可能会跳过屏蔽数组的步骤,直接创建mask
。例如,compressed
由matrix.data[~matrix.mask]
产生。
In [52]: mask = ~matrix.mask
In [53]: data = matrix.data
In [54]: np.stack((data[mask], np.where(mask)[0]), 1)