如何比较元素并删除那些不符合条件的元素

时间:2014-04-11 18:05:22

标签: python numpy

我想将一行的元素与numpy数组的下一行的元素进行比较。更确切地说是

a=np.array([[1,2,3],[10,12,13],[20,23,24],[45,46,49],[51,52,53]])

我知道我可以使用

获得差异
np.diff(a,axis=0)

返回:

array([[ 9, 10, 10],
   [10, 11, 11],
   [25, 23, 25],
   [ 6,  6,  4]])

但是如何在没有与下一行有差异< = 10的元素的情况下获得初始'a'数组。特别是第三列的差异。 我想得到的数组是;

array([[1,2,3],[20,23,24],[45,46,49]])

我很确定有一种(简单)方法可以用numpy做到这一点。也许与np.where

3 个答案:

答案 0 :(得分:3)

In [19]: a
Out[19]: 
array([[ 1,  2,  3],
       [10, 12, 13],
       [20, 23, 24],
       [45, 46, 49],
       [51, 52, 53]])

In [9]: d = np.diff(a,axis=0)

In [10]: d
Out[10]: 
array([[ 9, 10, 10],
       [10, 11, 11],
       [25, 23, 25],
       [ 6,  6,  4]])

形成布尔数组,当差值大于10时,该数组为True:

In [20]: d > 10
Out[20]: 
array([[False, False, False],
       [False,  True,  True],
       [ True,  True,  True],
       [False, False, False]], dtype=bool)

找到至少有一个元素为True的行:

In [21]: (d > 10).any(axis=1)
Out[21]: array([False,  True,  True, False], dtype=bool)

预先True选择a的第一行:

In [22]: np.r_[True, (d > 10).any(axis=1)]
Out[22]: array([ True, False,  True,  True, False], dtype=bool)

选择a行:

In [23]: a[np.r_[True, (d > 10).any(axis=1)]]
Out[23]: 
array([[ 1,  2,  3],
       [20, 23, 24],
       [45, 46, 49]])

答案 1 :(得分:1)

考虑到您希望第三列中的差异为< = 10:

In [1]: import numpy as np

In [2]: a = np.array([[1,2,3],[10,12,13],[20,23,24],[45,46,49],[51,52,53]])

In [4]: d = np.diff(a, axis=0)

In [12]: idxs = (d[:, 2] > 10)

In [15]: a[idxs, :]
Out[15]:
array([[10, 12, 13],
       [20, 23, 24]])

请注意,您只需要一个布尔数组(idxs用于“索引”)来切割原始数组。

a的第一行不符合规定的条件。

答案 2 :(得分:0)

与其他方法相比,方法略有不同,这可能与您的思维过程更好地对齐?

In [44]: d = np.diff(a[:,2])

In [45]: idx, = np.where(d <= 10)

In [46]: np.delete(a, idx, axis=0)
Out[46]: 
array([[10, 12, 13],
       [20, 23, 24],
       [51, 52, 53]])

In [47]: np.delete(a, idx+1, axis=0)
Out[47]: 
array([[ 1,  2,  3],
       [20, 23, 24],
       [45, 46, 49]])