我的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
答案 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