根据条件分割numpy

时间:2019-07-22 11:17:37

标签: python numpy

我需要根据第3列中Numpy数组的值拆分3D numpy数组。因此,假设第三列的值为0,1和2,那么我需要3个2d numpy数组,其中一个的值为0,其他的为1,依此类推。

我尝试过numpy.where,但没有成功。

这是我的数据示例:

(165, 69, 3)
(165, 70, 3)
(165, 71, 3)
(165, 72, 3)
(211, 416, 4)
(211, 417, 4)
(211, 418, 4)
(211, 419, 4)
(211, 420, 4)
(211, 421, 4)
(211, 422, 4)

所以在这种情况下,我需要两个数组,一个数组的值为3,另一个数组的值为4。

3 个答案:

答案 0 :(得分:3)

对于一般解决方案,您可以np.uniquereturn_index=True一起使用,然后使用np.split,如下所示:

import numpy as np

a = np.array(
    [(165, 69, 3),
     (165, 70, 3),
     (165, 71, 3),
     (165, 72, 3),
     (211, 416, 4),
     (211, 417, 4),
     (211, 418, 4),
     (211, 419, 4),
     (211, 420, 4),
     (211, 421, 4),
     (211, 422, 4)])

a = a[a[:, 2].argsort()]
third_col = a[:, 2]

_, indices = np.unique(third_col, return_index=True)
result = np.split(a, indices)[1:]

print(result)

输出:

[array([[165,  69,   3],
       [165,  70,   3],
       [165,  71,   3],
       [165,  72,   3]]),
array([[211, 416,   4],
       [211, 417,   4],
       [211, 418,   4],
       [211, 419,   4],
       [211, 420,   4],
       [211, 421,   4],
       [211, 422,   4]])]

答案 1 :(得分:-1)

让d为您的数组:

d[numpy.where(d[:,-1]==3)]

给出最后一行为3的所有行。

答案 2 :(得分:-1)

这就是您想要的:

import numpy as np

arr = np.array([[165, 69, 3], [165, 70, 3], [165, 71, 3], [165, 72, 3], [211, 416, 4], [
               211, 417, 4], [211, 418, 4], [211, 419, 4], [211, 420, 4], [211, 421, 4], [211, 422, 4]])

arr1 = arr[np.where(arr[:,2] == 3)]
arr2 = arr[np.where(arr[:,2] == 4)]

print(arr1)
print(arr2)