我想将一行的元素与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
?
答案 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]])