具有不同数据类型的

时间:2015-07-16 09:06:48

标签: python arrays matlab class

我最近将我的宗教信仰从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之外的其他内容)

1 个答案:

答案 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)