gpt4 book ai didi

python - 通过列表理解收集 np 数组的相同行

转载 作者:行者123 更新时间:2023-12-04 13:24:52 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





finding identical rows and columns in a numpy array

(4 个回答)


上个月关闭。
这个帖子是上个月编辑提交审核的,重新打开帖子失败:

重复 这个问题已经回答了,不是唯一的,也没有区别于另一个问题。





我有一个二维 np 数组,想通过列表理解收集相同的行。
我的实现返回了所需的结果,可以找到更好的解决方案 here :

import numpy as np


A = np.array([
[1,1,1,0,0,0], #sample input data
[0,0,1,0,1,1],
[0,0,1,0,1,1],
[1,1,1,0,0,0],
[0,0,1,0,1,1],
[1,0,0,0,0,0],
[1,0,1,0,0,0],
[1,0,0,0,1,0],
[1,0,0,0,0,0]
])




def gr_id_rows(Matrix): #returns list of lists of identical row indices

m = Matrix.shape[0]
M = Matrix
indices = list(range(m))
lst_of_lsts_ident = []

while len(M) > 0:
lst_ident = []
row_0 = M[0,:]
M = np.delete(M, 0, 0)
lst_ident.append(indices.pop(0))

k = 0
for row in M:
if np.array_equal(row, row_0):
M = np.delete(M, k, 0)
lst_ident.append(indices.pop(k))
else:
k += 1

lst_of_lsts_ident.append(lst_ident)

return lst_of_lsts_ident



#execution
print( gr_id_rows(A) ) #[[0, 3], [1, 2, 4], [5, 8], [6], [7]]

关于真实数据集的注意事项:
  • 它只是二进制。
  • 尺寸可以达到大约 1000 x 700,但大部分会在 60 x 40 左右。

  • 我们可以通过使用列表理解来优雅地做到这一点吗?
    我做了一个尝试(显然)产生了错误的结果。
    nbr_rows = A.shape[0]
    col_ind = range(A.shape[0])

    ind_eq = [[k for k in col_ind if np.array_equal(A[k,:], A[h,:]) and k != h] for h in col_ind]


    print(ind_eq) #[[3], [2, 4], [1, 4], [0], [1, 2], [8], [], [], [5]]

    最佳答案

    这是使用 numpy.equal 的解决方案关于 A 与自身的对比(广播),以及 itertools.groupby reshape 输出:

    from itertools import groupby
    a,b = np.equal(A, A[:,None]).all(2).nonzero()
    {tuple(b[i] for i in g) for i,g in groupby(range(len(a)), lambda i:a[i])}
    输出:
    {(0, 3), (1, 2, 4), (5, 8), (6,), (7,)}

    关于python - 通过列表理解收集 np 数组的相同行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69118204/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com