我最近将我的宗教信仰从Matlab改为Python进行数据分析。我经常需要导入很多数据文件,这些数据文件曾经存放在Matlab的结构数组中。这样我就可以在单个结构数组中存储大量不同的数据,其中数据所属的参数将存储在该结构中。我最终得到的结构如下:
data(i).parameterx = a
data(i).parametery = b
data(i).data1 = [3, 5, 7, 8, 423, 2, 56, 6]
data(i).data2 = [4, 2, 5; 4, 6, 2; 5, 1, 3]
data
的长度是我导入的数据文件的数量。这样我就可以根据data
的索引检索每个数据集的所有参数。
所以我想在Python中做同样的事情。我尝试使用class
,但似乎我无法将其存储在数组中。
我尝试的是以下内容:
#!/usr/bin/env python
# Import modules
import numpy as np
import fnmatch
import os
# Set up all elements of the path
class path:
main, dir = 'root/dir', 'data_dir'
complete = os.path.join(main,dir)
ext = 'odt' # Extension of the file to look for
# Initialize data array and data-class
all_data=[]
class odt_data:
pass
# Loop through all files in path.complete and find all ODT-files
for (root, dirnames, filenames) in os.walk(path.complete):
for filename in fnmatch.filter(filenames, '*.'+path.ext):
# Only ODT-files
# Extract parameters from filename
parameters = filename.split('__')
odt_data.parameterx = parameters[0]; odt_data.parametery = parameters[2]
# Import data from file and assign to correct attribute of 'odt_data'
file=os.path.join(root, filename)
data=np.loadtxt(file)
odt_data.data1 = data[:,0]; odt_data.data2 = data[:,1]
# Append new data to array of all data
all_data.append(odt_data)
这里的问题是,它并没有真正保存odt_data
中的数据,而是保存对它的引用。因此,当我print(all_data)
时,结果是:
[<class '__main__.odt_data'>, <class '__main__.odt_data'>, <class '__main__.odt_data'>]
因此仅存储最后导入的数据:all_data[0]
与all_data[1]
完全相同,依此类推。因此,我无法访问第一个或第二个导入文件的数据,只能访问最后一个文件的数据。所以当我调用all_data[1].parameterx
时,我得到最后导入文件的parameterx
值,而不是第二个!
注意:我不关心它是如何打印的,我只关心访问所有导入的数据
任何人都知道将数据odt_data
中的实际数据存储在数组中的方法(或者可能使用除class
之外的其他内容)
答案 0 :(得分:1)
您只需要在循环中初始化类。
但是,这不是您在Python中存储此类数据的方式。你不会在这里使用一个类(在任何一种情况下)。 Python实际上有结构化数组,但在这种情况下它是过度的。最简单的解决方案是使用一个dicts列表:
# Import modules
import numpy as np
import os
main = 'root/dir'
dir = 'data_dir'
complete = os.path.join(main,dir)
ext = '.odt' # Extension of the file to look for
# Initialize data array
all_data = []
for root, _, filenames in os.walk(path.complete):
for filename in filenames:
if os.path.splitext(filename)[-1] != ext:
continue
odt_data = {}
# Only ODT-files
# Extract parameters from filename
odt_data['parameterx'], odt_data['parametery'] = filename.split('__')
# Import data from file and assign to correct attribute of 'odt_data'
fname = os.path.join(root, filename)
data = np.loadtxt(fname)
odt_data['data1'] = data[:,0]
odt_data['data2'] = data[:,1]
# Append new data to array of all data
all_data.append(odt_data)