将矩阵转换为元组

时间:2018-12-31 07:17:02

标签: python arrays numpy

假设我生成一个值序列,按提供的范围对它们进行平铺,然后按当前行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]

此外,原始代码是否太浪费了以至于无法实现最终所需的步骤?

1 个答案:

答案 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。例如,compressedmatrix.data[~matrix.mask]产生。

In [52]: mask = ~matrix.mask
In [53]: data = matrix.data
In [54]: np.stack((data[mask], np.where(mask)[0]), 1)