Arrays 删除包含numpy数组相同副本的.txt文件

Arrays 删除包含numpy数组相同副本的.txt文件,arrays,numpy,Arrays,Numpy,我需要一种有效的方法来消除文本文件中存储的重复整数np数组。情况如下: 在文件夹C:\z_data\6_8_arrays中,有数千个小文本文件,每个文件包含一个相同形状的数组(在本例中,有6行8列)。文本文件的格式如下: 0 4 5 7 3 4 6 2 8 6 0 9 9 1 2 4 6 6 7 4 5 6 3 1 3 1 3 2 3 3 5 3 4 1 2 0 9 6 0 0 9 9 8 2 4 1 0 1 虽然许多文本数组是唯一的,但也存在大量重复。有些阵列甚至可能在相同的副本中出现25到

我需要一种有效的方法来消除文本文件中存储的重复整数np数组。情况如下:

在文件夹C:\z_data\6_8_arrays中,有数千个小文本文件,每个文件包含一个相同形状的数组(在本例中,有6行8列)。文本文件的格式如下:

0 4 5 7 3 4 6 2
8 6 0 9 9 1 2 4
6 6 7 4 5 6 3 1
3 1 3 2 3 3 5 3
4 1 2 0 9 6 0 0
9 9 8 2 4 1 0 1
虽然许多文本数组是唯一的,但也存在大量重复。有些阵列甚至可能在相同的副本中出现25到30次

问题:有没有有效的方法删除包含重复数组的文本文件(.txt)?

我认为第一步需要将文件夹中的所有文本数组加载到(6,8,n)numpy数组中,然后消除重复项。不过,最大的挑战是,我需要从文件夹中删除重复的文本文件。
如果给定的数组在(比如)10个文件中显示相同,我需要删除其中的9个。保留10个文件中的哪一个并不重要。

不是最好的方法,但可以有所帮助

import os
arr_files = os.listdir('<path_with_numpy_array_files>')
array_list = np.empty((1, 6,8))
for arr_file in arr_files:
    flag = 0
    # load the numpy array
    arr = np.loadtxt(arr_file)       # shape of this will be 6x8
    arr_3 = arr.reshape((-1,6,8))
    for entry in array_list:
        # check if it already exists in our array list
        if np.array_equal(entry, arr):
            # array already there, can discard that file
            print('file to be discarded', arr_file)
            flag = 1
            # os.remove(arr_file)
    if flag == 0:
        array_list = np.concatenate((array_list, arr_3), axis=0)
        
导入操作系统
arr_files=os.listdir(“”)
数组_list=np.empty((1,6,8))
对于arr_文件中的arr_文件:
标志=0
#加载numpy数组
arr=np.loadtxt(arr#u文件)#其形状为6x8
arr_3=arr.重塑(-1,6,8))
对于数组_列表中的条目:
#检查它是否已经存在于我们的数组列表中
如果np.数组_相等(条目,arr):
#数组已存在,可以放弃该文件
打印('要丢弃的文件',arr_文件)
标志=1
#删除操作系统(arr_文件)
如果标志==0:
数组列表=np。连接((数组列表,arr\u 3),轴=0)

我会尝试利用测试集合成员身份的速度很快这一事实,因此我会为每个文件生成一个哈希摘要,这样我就不需要分配内存来同时保存所有文件的全部内容。我假设文件是由程序生成的,因此文件中的布局和间距彼此一致

  • 为哈希摘要创建空集
  • 迭代所有文本文件,为每个文本文件生成哈希摘要
  • 若摘要已在集合中,则删除文件,否则将摘要添加到集合中

我生成了8000个类似于您的文件,并在大约一秒钟内删除了重复的文件


显然,请在文件的副本上测试这一点。

我将定义
array\u list=[]
,一个真正的列表(而不是冒充一个数组),附加到列表中更快(比
stack
;迭代速度也更快。您实际测试过吗?
np。stack
每次调用时都会添加一个新维度!它对参数列表中数组的维度也很挑剔。是的,我已经测试过了。使用
axis=0
进行堆栈将数组列表的维度保持为
6x8xn
使用for循环,我们在n
array_list
上迭代,从(6,8)开始,然后变为(2,6,8)。然后它尝试将其与(6,8)合并,从而产生一个错误。
#!/usr/bin/env python3

import hashlib
from pathlib import Path

# Empty set of hash digests seen so far
seen = set()

# Iterate over all text files
for filename in Path('.').glob('*.txt'):

    # Read entire file and generate hash digest of its contents
    with open(filename, "rb") as f:
        digest = hashlib.sha256(f.read()).digest()

    # Test if same as any other
    if digest in seen:
        print(f'Would delete {filename}')
        #Path(filename).unlink()
    else:
        seen.add(digest)