Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除numpy数组的值,同时保留维度_Python_Numpy - Fatal编程技术网

Python 删除numpy数组的值,同时保留维度

Python 删除numpy数组的值,同时保留维度,python,numpy,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

我有一个
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

虽然锯齿状数组不是您真正应该使用的东西,但您可以使用列表执行以下操作:

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,)

您试图保持哪些维度
a.shape
(3,4)
。你怎么能 从
a
中删除2项,但仍有3x4数组(3*4=12)

所需的显示不是(3,4)阵列:

由于行的长度不同,它会创建一个对象数据类型数组,每行一个元素。这基本上是一个列表列表

出于某些目的,制作一个
面具很方便:

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

NumPy实际上不支持锯齿数组。正如miradulo所指出的,NumPy不支持锯齿数组。(好吧,你可以创建一个对象数组,但这可能无法解决本例中的问题。结果不会像二维数组一样。)你将如何处理结果?了解您计算的最终目标将有助于指导此处给出的答案。@WarrenWeckesser感谢您的回答。我已经创建了一个ipynb,我的最终目标是:谢谢你的回答,我很想使用
MaskedArray
,但我接下来的步骤是使用锯齿阵列来切片另一个阵列,我不能使用
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)