遍历多维数组并根据条件进行过滤

时间:2019-10-03 02:00:28

标签: python arrays python-3.x numpy

我相信已经提出了 like 个问题,但没有一个问题可以解决我面临的问题。

我有一个形状为(H,W,L)的数组-我必须遍历该数组的每个实例以过滤出满足特定条件的值(它们的x,y位置)。 (例如val > t_rval < t_c)-我必须对K个值中的每一个重复此操作。

例如:如果我们有一个形状为(2,3,4)的数组

A = [[[1,2,3,], [3,4,5,]], 
        [[6,7,8],[1,4,5]], 
        [[5,7,7],[9,4,3]],
        [[1,2,4],[4,6,7]]]

假设第一个条件为val > 2,第二个条件为val < 6,并将(row,col)值存储在N x 3数组中。前两个值是'row','col',最后一个值对应于图层/第三维。 那么该操作的预期输出应类似于-

output = [[0,2,0],[1,0,0],[1,0,0],[1,1,0],[1,2,0]....]对应于从A[:,:,0]过滤的值

我想到的一种方法是-使用3个for循环-i,j,k遍历每个元素,但是我无法弄清楚确切的实现。我还想尽可能地实现矢量化。我可以使用一些指导。

1 个答案:

答案 0 :(得分:1)

您可以使用np.nonzero并向量化比较。

a = np.asarray(A)
res = np.vstack(np.nonzero((a>2)&(a<6))).T

array([[0, 0, 2],
       [0, 1, 0],
       [0, 1, 1],
       [0, 1, 2],
       [1, 1, 1],
       [1, 1, 2],
       [2, 0, 0],
       [2, 1, 1],
       [2, 1, 2],
       [3, 0, 2],
       [3, 1, 0]], dtype=int64)

您始终可以根据自己的喜好对列进行重新排序,例如:

res[:, [1,2,0]]

array([[0, 2, 0],
       [1, 0, 0],
       [1, 1, 0],
       [1, 2, 0],
       [1, 1, 1],
       [1, 2, 1],
       [0, 0, 2],
       [1, 1, 2],
       [1, 2, 2],
       [0, 2, 3],
       [1, 0, 3]], dtype=int64)