如何逐列附加要素并为每个样本开始一行

时间:2017-08-28 15:00:53

标签: python numpy scikit-learn

我正在尝试创建一个训练数据文件,其结构如下:

[Rows = Samples,Columns = features]

因此,如果我有100个样本和2个特征,我的np.array的形状将是(100,2)。

下面的列表包含.nrrd 3D样本补丁数据文件的路径字符串。

['/Users/FK/Documents/image/0128/subject1F_200.nrrd',
 '/Users/FK/Documents/image/0128/subject2F_201.nrrd']

这是我到目前为止的代码:

training_file = []

# For each sample in my image folder
for patches in dir_0128_list:

    # Reads the 64x64x64 numpy array
    data, options = nrrd.read(patches)

    # Calculates the median and sum of the 3D array file. 2 Features per sample
    f_median = np.median(data)
    training_file.append(f_median)

    f_sum = np.sum(data)
    training_file.append(f_sum)


    # Calculates a numpy array with the following shape (169,) containing 169 features per sample.
    f_mof = my_own_function(data)
    training_file.append(f_mof)


training_file = np.array((training_file), dtype=np.float32)    
# training_file = np.column_stack((core_training_list))

如果我不使用np.column_stack函数,我会得到一个(173,1)矩阵。 (1,173)如果我运行该功能。在这种情况下,它应该具有(2,171)形状。

我想计算总和和中位数并将其附加到列表或numpy数组列中。在for循环结束时,我想向下跳1行并为第二个样本添加2个特征列,依此类推......

1 个答案:

答案 0 :(得分:0)

非常简单的解决方案

而不是

f_median = np.median(data)
training_file.append(f_median)

f_sum = np.sum(data)
training_file.append(f_sum)

你可以做到

training_file.append((np.median(data), np.sum(data)))

稍长的解决方案

然后你仍然会有一段不容易重复使用且连续测试的连续代码。 我会构建脚本的不同部分

  1. 迭代文件以阅读补丁
  2. 计算平均值和总和
  3. 汇总到请求的格式
  4. 阅读补丁

    def read_patches(files):
        for file in files:
            yield nrrd.read(file)
    

    让生成器产生补丁信息

    计算

    def parse_patch(patch):
        data, options = patch
        return np.median(data), np.sum(data)
    

    把它放在一起

    from pathlib import Path
    file_dir = Path(<my_filedir>)
    files = file_dir.glob('*.nrrd')
    
    patches = read_patches(files)
    training_file = np.array([parse_patch(patch) for patch in patches], dtype=np.float32)
    

    这可能看起来很复杂,但它允许轻松测试每个子块