Arrays 删除包含numpy数组相同副本的.txt文件
我需要一种有效的方法来消除文本文件中存储的重复整数np数组。情况如下: 在文件夹C:\z_data\6_8_arrays中,有数千个小文本文件,每个文件包含一个相同形状的数组(在本例中,有6行8列)。文本文件的格式如下: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到
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循环,我们在narray_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)