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

**URL:** <https://mne.discourse.group/t/question-about-label-order-in-schaefer-atlas-parcellation-and-time-course-extraction/10815>\
**Category:** Support & Discussions\
**Tags:** ﻿source-localization, eeg\
**Created:** [February 18, 2025, 4:09am UTC](https://mne.discourse.group/t/question-about-label-order-in-schaefer-atlas-parcellation-and-time-course-extraction/10815 "2025-02-18T04:09:31Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Davi1990](https://avatars.discourse-cdn.com/v4/letter/d/54ee81/32.png) [@Davi1990](https://mne.discourse.group/u/Davi1990)\
**Post date:** [February 18, 2025, 4:09am UTC](https://mne.discourse.group/t/question-about-label-order-in-schaefer-atlas-parcellation-and-time-course-extraction/10815/1 "2025-02-18T04:09:31Z")

</div>

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:

```python
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:

```python
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](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

---

<div class="post-metadata">

**Author:** ![Pouyarabiei](https://yyz2.discourse-cdn.com/free1/user_avatar/mne.discourse.group/pouyarabiei/32/4170_2.png) [@Pouyarabiei](https://mne.discourse.group/u/Pouyarabiei)\
**Post date:** [April 13, 2025, 10:24pm UTC](https://mne.discourse.group/t/question-about-label-order-in-schaefer-atlas-parcellation-and-time-course-extraction/10815/2 "2025-04-13T22:24:04Z")

</div>

Hi Dave

I have the same issue  
Could you find a solution?

---

<div class="post-metadata">

**Author:** ![Yuuhann1999](https://yyz2.discourse-cdn.com/free1/user_avatar/mne.discourse.group/yuuhann1999/32/4281_2.png) [@Yuuhann1999](https://mne.discourse.group/u/Yuuhann1999)\
**Post date:** [April 14, 2025, 3:24pm UTC](https://mne.discourse.group/t/question-about-label-order-in-schaefer-atlas-parcellation-and-time-course-extraction/10815/4 "2025-04-14T15:24:45Z")

</div>

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!
