在保持尺寸的同时删除numpy数组的值

时间:2018-04-06 19:38:14

标签: python numpy

我的numpy数组如下:

a = np.array([[1, 2, 3, -999.],
              [2, 3, 4, -999.],
              [3, 4, 5, 6]])

如何在保留尺寸的同时删除值-999.

array([[   1.,    2.,    3.],
       [   2.,    3.,    4.],
       [   3.,    4.,    5.,    6.]])

我试过了:

np.delete(a, np.where(a == -999.))

但是这个结果

array([   3.,    2.,    3.,    4., -999.,    3.,    4.,    5.,    6.])

我试过

a[a == -999.] = np.nan
a[~np.isnan(a)]

虽然它删除了nan(以及-999),但numpy数组变为1D

array([1., 2., 3., 2., 3., 4., 3., 4., 5., 6.])

修改

我使用生成的锯齿状数组(列表列表)来切割另一个数组,其中每个切片的长度可以不同。

我的用例:

a = np.random.randint(1,35,size=(100000,5))
a[a == 14] = -999 # set a missing value

选项1,选择值不等于填充值

%%timeit
slices = np.array([i[i != -999] for i in a])

10 loops, best of 3: 183 ms per loop

选项2,掩盖和压缩

%%timeit
a_ma = np.ma.masked_equal(a, -999)
slices = np.array([i.compressed() for i in a_ma])

1 loop, best of 3: 2.99 s per loop

2 个答案:

答案 0 :(得分:1)

虽然参差不齐的数组并不是您应该使用的东西,但您可以使用列表理解来执行以下操作:

In [33]: a = np.array([i[i != -999.] for i in a])

In [34]: a
Out[34]:
array([array([ 1.,  2.,  3.]), array([ 2.,  3.,  4.]),
       array([ 3.,  4.,  5.,  6.])], dtype=object)

In [35]: a[0].shape
Out[35]: (3,)

In [36]: a[1].shape
Out[36]: (3,)

In [37]: a[2].shape
Out[37]: (4,)

答案 1 :(得分:1)

您尝试保留哪些尺寸? a.shape(3,4)。你怎么 从a删除2个项目,仍然有3x4数组(3 * 4 = 12)?

您想要的显示器不是(3,4)阵列:

In [638]: arr = np.array([[   1.,    2.,    3.],
     ...:        [   2.,    3.,    4.],
     ...:        [   3.,    4.,    5.,    6.]])
     ...:        
In [639]: arr
Out[639]: 
array([list([1.0, 2.0, 3.0]), list([2.0, 3.0, 4.0]),
       list([3.0, 4.0, 5.0, 6.0])], dtype=object)
In [640]: arr.shape
Out[640]: (3,)

因为行的长度不同,所以它会创建一个对象dtype数组,每行一个元素。这基本上是一个列表清单。

出于某些目的,制作MaskedArray

非常方便
In [637]: np.ma.masked_equal(a, -999)
Out[637]: 
masked_array(
  data=[[1.0, 2.0, 3.0, --],
        [2.0, 3.0, 4.0, --],
        [3.0, 4.0, 5.0, 6.0]],
  mask=[[False, False, False,  True],
        [False, False, False,  True],
        [False, False, False, False]],
  fill_value=-999.0)

我发现您之前曾与MaskedArrays合作过update numpy array where not masked