Question about Label Order in Schaefer Atlas Parcellation and Time Course Extraction

I’m working with the Schaefer 2018 400-parcel atlas and have noticed a potential discrepancy in label ordering. Here’s my workflow:

  1. I read the labels and extract their names:
labels2use = 'Schaefer2018_400Parcels_7Networks_order'
labels_schaefer = mne.read_labels_from_annot(subject, parc=labels2use, 
                                            subjects_dir=fs_directories, verbose=False)
labels_names = []
for xx in range(len(labels_schaefer)):
    labels_names.append(labels_schaefer[xx].name)
labels_names = labels_names[1:-1]
for xx in range(len(labels_names)):
    labels_names[xx] = labels_names[xx].split('7Networks_')[1].split('-')[0]
  1. Then extract time courses:
label_ts = mne.extract_label_time_course(stc, labels_schaefer, src, 
                                        mode="mean", allow_empty=True, verbose=False)[1:-1]

When I compare the label ordering (variable labels_names) I get from mne.read_labels_from_annot() with the canonical Schaefer ordering (please see here): https://github.com/ThomasYeoLab/CBIG/blob/master/stable_projects/brain_parcellation/Schaefer2018_LocalGlobal/Parcellations/MNI/Centroid_coordinates/Schaefer2018_400Parcels_7Networks_order_FSLMNI152_2mm.Centroid_RAS.csv), I notice they don’t match.

Questions:

  1. Why does the order of labels from read_labels_from_annot match the canonical Schaefer ordering?
  2. Shall I reorder the extracted time courses to match the canonical order?
  3. Could this affect network-based analyses if not addressed?
  4. When I extract label time courses using mne.extract_label_time_course(), does the output maintain the same order as the input labels from read_labels_from_annot?
  5. Is the [1:-1] slicing when getting both label names and time courses the correct approach to match the 400 parcels?

Thank you for any clarification!

Dave

Hi Dave

I have the same issue
Could you find a solution?

Hi Dave,

Here’s a response to each of your questions:

  1. The label order from mne.read_labels_from_annot() is not guaranteed to match the canonical Schaefer ordering. MNE loads labels based on their appearance in the annotation file, which might not correspond to the order defined in the Yeo lab’s CSV files.
  2. Yes, if you rely on network-specific analyses or comparisons across subjects, it’s strongly recommended to reorder the extracted time courses based on the canonical order. This can be done by matching label names.
  3. Absolutely — mismatched label ordering can lead to incorrect region-wise or network-level interpretations. Ensuring canonical ordering is critical for valid results.
  4. The order of label_ts matches the order of the labels list passed to mne.extract_label_time_course. So the key is to reorder labels_schaefer correctly before calling this function.
  5. The [1:-1] slicing might remove important labels if not verified. It’s safer to explicitly filter by label name (e.g., exclude those with 'unknown' or 'medialwall' in the name) than to slice blindly.

Hope that helps clarify things!