从给定的 numpy 数组中过滤出值

filter out values from a given numpy array

程序写入以下二维数组,其中包含需要构建的另一个数组的列索引:

A = np.array([[   7,    0 ,   6 ,   0 ,   4 ,   0 ,   9,   0, 7215, 7215],\
[   1,    8,    1,    2,    1,    9,    1,    3, 7215, 7215],
[   1 ,   5 ,   1,    8, 7215, 7215, 7215, 7215, 7215, 7215],
[   1  ,  8  ,  1,    9, 7215, 7215, 7215, 7215, 7215, 7215],
[   9   , 0 ,   8,    9, 7215, 7215, 7215, 7215, 7215, 7215],
[   2 ,   6 ,   8,    7, 7215, 7215, 7215, 7215, 7215, 7215],
[   5  ,  0 ,   7,    0, 7215, 7215, 7215, 7215, 7215, 7215],
[   8 ,   0 ,   5,    6, 7215, 7215, 7215, 7215, 7215, 7215],
[   1 ,   7,    2,    5,    3,    9,    9,    4, 7215, 7215],
[   1 ,   4,    3,    8,    8,    0,    4,    0, 7215, 7215]], dtype=int)
print(A)

过滤器必须满足 2 个条件:

矩阵中的大数,7215是我用来初始化矩阵的值。该项目没有其他目的。

因此,我需要的是一个计算如下内容的代码:

# row 0: 7, 6, 4, 9
# row 1: 8, 2, 9, 3
# row 2: 1, 5, 8
# row 3: 1, 8, 9
# row 4: 9, 0, 8, 9
# row 5: 2, 6, 8, 7
# row 6: 5, 0, 7
# row 7: 8, 0, 5, 6
# row 8: 1, 7, 2, 5, 3, 9, 9, 4
# row 9: 1, 4, 3, 8, 8, 0, 4

我相信第一个需求可以满足如下:

tl = A.shape
l = tl[0]
B = np.full((l,l), 7215)
for i in range(l):
        for j in range(l):
                if A[i][j] != i:
                        B[i][j] = A[i][j]

但我不知道如何满足下一个要求,尽管下面的代码看起来很有希望:

for i in range(l):

        C, counts = np.unique(B[i][:], return_counts=True)
        print(C)

编辑:错过了您不想要 0 和 1 的重复项。这修复了您的 A 矩阵中的问题。

def remove_after_first(arr, val):
    idx = np.where(arr == val)
    drop_idx = idx[0][1:] == idx[0][:-1]
    arr[idx[0][1:][drop_idx], idx[1][1:][drop_idx]] = 7215

remove_after_first(A, 0)
remove_after_first(A, 1)

制作一个二维数组B,其中第一列是行索引,第二列是来自A的值,使用np.where去掉NA值( 7215?)。

B = np.where(A != 7215)
B = np.hstack((B[0].reshape(-1, 1), A[B].reshape(-1, 1)))

删除行和列相等的任何情况。

B = B[B[:, 0] != B[:, 1]]

如果您真的想将它们撕成基于行的参差不齐的数组列表,您可以很容易地做到这一点。 row/col 索引通常更有用。

B_list = [B[B[:, 0] == i, 1] for i in range(A.shape[0])]

>>> B_list

[array([7, 6, 4, 9]),
 array([8, 2, 9, 3]),
 array([1, 5, 8]),
 array([1, 8, 9]),
 array([9, 0, 8, 9]),
 array([2, 6, 8, 7]),
 array([5, 0, 7]),
 array([8, 0, 5, 6]),
 array([1, 7, 2, 5, 3, 9, 9, 4]),
 array([1, 4, 3, 8, 8, 0, 4])]