从给定的 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 个条件:
- 主对角线没有列索引,其中列索引 = 行索引
- 仅允许列索引大于 0 或 1 的列重复
矩阵中的大数,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])]
程序写入以下二维数组,其中包含需要构建的另一个数组的列索引:
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 个条件:
- 主对角线没有列索引,其中列索引 = 行索引
- 仅允许列索引大于 0 或 1 的列重复
矩阵中的大数,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])]