|
11 | 11 | import os
|
12 | 12 | import os.path as op
|
13 | 13 | from collections import OrderedDict
|
| 14 | +from itertools import chain |
14 | 15 |
|
15 | 16 | import nibabel as nb
|
16 | 17 | import numpy as np
|
@@ -1262,11 +1263,18 @@ def compute_noise_components(imgseries, mask_images, components_criterion=0.5,
|
1262 | 1263 | Dictionary of eigenvalues, fractional explained variances, and
|
1263 | 1264 | cumulative explained variances.
|
1264 | 1265 | """
|
1265 |
| - components = None |
1266 | 1266 | basis = np.array([])
|
1267 | 1267 | if components_criterion == 'all':
|
1268 | 1268 | components_criterion = -1
|
1269 | 1269 | mask_names = mask_names or range(len(mask_images))
|
| 1270 | + |
| 1271 | + comp_list = [] |
| 1272 | + md_mask = [] |
| 1273 | + md_sv = [] |
| 1274 | + md_var = [] |
| 1275 | + md_cumvar = [] |
| 1276 | + md_retained = [] |
| 1277 | + |
1270 | 1278 | for name, img in zip(mask_names, mask_images):
|
1271 | 1279 | mask = nb.squeeze_image(img).get_data().astype(np.bool)
|
1272 | 1280 | if imgseries.shape[:3] != mask.shape:
|
@@ -1331,32 +1339,30 @@ def compute_noise_components(imgseries, mask_images, components_criterion=0.5,
|
1331 | 1339 | num_components = int(num_components)
|
1332 | 1340 | if num_components == 0:
|
1333 | 1341 | break
|
1334 |
| - if components is None: |
1335 |
| - components = u[:, :num_components] |
1336 |
| - metadata = OrderedDict() |
1337 |
| - metadata['mask'] = [name] * len(s) |
1338 |
| - metadata['singular_value'] = s |
1339 |
| - metadata['variance_explained'] = variance_explained |
1340 |
| - metadata['cumulative_variance_explained'] = ( |
1341 |
| - cumulative_variance_explained) |
1342 |
| - metadata['retained'] = [i < num_components for i in range(len(s))] |
1343 |
| - else: |
1344 |
| - components = np.hstack((components, u[:, :num_components])) |
1345 |
| - metadata['mask'] = metadata['mask'] + [name] * len(s) |
1346 |
| - metadata['singular_value'] = ( |
1347 |
| - np.hstack((metadata['singular_value'], s))) |
1348 |
| - metadata['variance_explained'] = ( |
1349 |
| - np.hstack((metadata['variance_explained'], |
1350 |
| - variance_explained))) |
1351 |
| - metadata['cumulative_variance_explained'] = ( |
1352 |
| - np.hstack((metadata['cumulative_variance_explained'], |
1353 |
| - cumulative_variance_explained))) |
1354 |
| - metadata['retained'] = ( |
1355 |
| - metadata['retained'] + [i < num_components for i in range(len(s))]) |
1356 |
| - if components is None: |
| 1342 | + |
| 1343 | + components.append(u[:, :num_components]) |
| 1344 | + md_mask.append([name] * len(s)) |
| 1345 | + md_sv.append(s) |
| 1346 | + md_var.append(variance_explained) |
| 1347 | + md_cumvar.append(cumulative_variance_explained) |
| 1348 | + md_retained.append(i < num_components for i in range(len(s))) |
| 1349 | + |
| 1350 | + if len(components) > 0: |
| 1351 | + components = np.hstack(components) |
| 1352 | + else: |
1357 | 1353 | if failure_mode == 'error':
|
1358 | 1354 | raise ValueError('No components found')
|
1359 |
| - components = np.full((M.shape[0], num_components), np.nan) |
| 1355 | + components = np.full((M.shape[0], num_components), |
| 1356 | + np.nan, dtype=np.float32) |
| 1357 | + |
| 1358 | + metadata = OrderedDict( |
| 1359 | + ('mask', list(chain(*md_mask))), |
| 1360 | + ('singular_value', np.hstack(md_sv)), |
| 1361 | + ('variance_explained', np.hstack(md_var)), |
| 1362 | + ('cumulative_variance_explained', np.hstack(md_cumvar)), |
| 1363 | + ('retained', list(chain(*md_retained))) |
| 1364 | + ) |
| 1365 | + |
1360 | 1366 | return components, basis, metadata
|
1361 | 1367 |
|
1362 | 1368 |
|
|
0 commit comments