在这里,我的代码专长于表单文本文件;并将矩阵创建为多维数组,但是问题是代码创建的数组比二维数组更多,我无法操纵,我需要二维数组,我该怎么做?
解释我的代码的算法:
代码动机: 我的代码从一个特定的文件夹中获取值,每个文件夹包含一个用户生成的7个“ txt”文件,这样,多个文件夹将包含多个用户的多个数据。
步骤1:启动第一个for循环,并使用特定文件夹中的文件夹数量来控制它,并在变量“ path”中存储第一个文件夹的第一个路径。
第2步:使用2nd for loop打开路径并获取7个txt文件的数据。专长之后,它关闭2nd for loop并执行其余代码。
step3:将7个txt文件的数据合并到一个1d数组中。
step4(此处出现问题):将每个文件夹的1d位置存储为2d数组。首先结束循环。
代码:
import numpy as np
from array import *
import os
f_path='Result'
array_control_var=0
#for feacth directory path
for (path,dirs,file) in os.walk(f_path):
if(path==f_path):
continue
f_path_1= path +'\page_1.txt'
#Get data from page1 indivisualy beacuse there string type data exiest
pgno_1 = np.array(np.loadtxt(f_path_1, dtype='U', delimiter=','))
#only for page_2.txt
f_path_2= path +'\page_2.txt'
with open(f_path_2) as f:
str_arr = ','.join([l.strip() for l in f])
pgno_2 = np.asarray(str_arr.split(','), dtype=int)
#using loop feach data from those text file.datda type = int
for j in range(3,8):
#store file path using variable
txt_file_path=path+'\page_'+str(j)+'.txt'
if os.path.exists(txt_file_path)==True:
#genarate a variable name that auto incriment with for loop
foo='pgno_'+str(j)
else:
break
#pass the variable name as string and store value
exec(foo + " = np.array(np.loadtxt(txt_file_path, dtype='i', delimiter=','))")
#z=np.array([pgno_2,pgno_3,pgno_4,pgno_5,pgno_6,pgno_7])
#marge all array from page 2 to rest in single array in one dimensation
f_array=np.concatenate((pgno_2,pgno_3,pgno_4,pgno_5,pgno_6,pgno_7), axis=0)
#for first time of the loop assing this value
if array_control_var==0:
main_f_array=f_array
else:
#here the problem arise
main_f_array=np.array([main_f_array,f_array])
array_control_var+=1
print(main_f_array)
当前我的代码生成这样的数组(用于3个文件夹)
[ array([[0,0,0],[0,0,0]]), array([0,0,0]) ]
注意:我不知道它有多少尺寸
但是我想要
[ array( [0,0,0] [0,0,0] [0,0,0]) ]
答案 0 :(得分:0)
我试图编写一个递归代码,将列表的列表递归地压缩为一个列表。它为您的情况提供了所需的输出,但是我没有在许多其他输入中尝试过(对于某些情况,它是有问题的,例如:list =[0,[[0,0,0],[0,0,0]],[0,0,0]]
)……
flat = []
def main():
list =[[[0,0,0],[0,0,0]],[0,0,0]]
recFlat(list)
print(flat)
def recFlat(Lists):
if len(Lists) == 0:
return Lists
head, tail = Lists[0], Lists[1:]
if isinstance(head, (list,)):
recFlat(head)
return recFlat(tail)
else:
return flat.append(Lists)
if __name__ == '__main__':
main()
我在代码背后的想法是遍历每个列表的头部,并检查它是列表的实例还是元素。如果head是一个元素,则意味着我有一个平面列表,我可以返回该列表。否则,我应该递归遍历更多。