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)