我已经问过这个问题的一个变体,但我仍然对代码的运行时有疑问。
给定一个由 15000 行和 44 列组成的 numpy 数组。我的目标是找出哪些行相等并将它们添加到列表中,如下所示:
1 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 0
1 2 3 4 5
结果:
equal_rows1 = [1,2,3]
equal_rows2 = [0,4]
到目前为止我所做的是使用以下代码:
import numpy as np
input_data = np.load('IN.npy')
equal_inputs1 = []
equal_inputs2 = []
for i in range(len(input_data)):
for j in range(i+1,len(input_data)):
if np.array_equal(input_data[i],input_data[j]):
equal_inputs1.append(i)
equal_inputs2.append(j)
问题在于,返回所需的数组需要花费大量时间,并且这仅允许 2 个不同的“相似行列表”,尽管可以有更多。有没有更好的解决方案,特别是在运行时方面?
最佳答案
这对于 pandas groupby
来说非常简单:
df
A B C D E
0 1 0 0 0 0
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0 0 0
4 1 0 0 0 0
5 1 2 3 4 5
[g.index.tolist() for _, g in df.groupby(df.columns.tolist()) if len(g.index) > 1]
# [[1, 2, 3], [0, 4]]
如果您正在处理许多行和许多独特的组,这可能会有点慢。性能取决于您的数据。也许有更快的 NumPy 替代方案,但这肯定是最容易理解的。
关于python - NumPy 数组中相同行的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54132351/