Другие ответы уже касаются того, как исправить ошибку, но не упоминайте, что есть намного более простой способ сделать все это.
В целом, я могу придумать несколько разных причин, почему люди используют Numpy:
- Numpy массивы могут быть быстрее, чем списки Python, если у вас много данных на массив, вам не нужно конвертировать туда и обратно между Numpy массивами и python перечисляет, и вы используете Numpy операции, которые неявно работают со всем массивом, вместо того, чтобы явно зацикливаться на отдельных элементах
- Код с использованием Numpy массивов может быть более кратким, поскольку вы можете, например, часто. заменить несколько вложенных циклов одной Numpy операцией
- Вы просто хотите использовать некоторые функции, которые уже доступны в Numpy
Вам не хватает точек 1 и 2; Вы используете Numpy, но не пользуетесь им в полной мере, поэтому ваш код не такой быстрый и лаконичный, как мог бы.
Во-первых, несколько не Numpy слов совета:
- Если вы не используете форму с тремя аргументами
range()
, вы можете опустить стартовую позицию, если она 0 - ie. range(N)
делает то же самое, что и range(0, N)
- Если вы перебираете все индексы списка / массива и используете их только для прямой индексации указанного массива (ie. Не например, для вычислений), вы должны просто перебрать значения вместо - ie. вместо
for i in range(len(items)): item = items[i]
вы должны сделать for item in items:
. Если вам также нужен указатель, вы можете сказать for i, item in enumerate(items):
- Во внутреннем l oop вы просто копируете элементы по одному - если вам не нужно ничего делать с элементы по отдельности, просто сделайте это за один go: (я буду сокращать
extract_bootstrap_timepoint
до ebt
) - Если тип в порядке, и вам не нужна копия, просто назначьте ее например
new[roi] = ebt
- Если это массив (как здесь) и вам нужен список, просто сначала преобразуйте его с помощью
new[roi] = list(ebt)
или new[roi] = ebt.tolist()
(последний работает только с массивами) - Если это уже список, и вам нужна копия, просто сделайте копию, например
new[roi] = ebt.copy()
или new[roi] = ebt[:]
(последняя не работает с массивами) - Если у вас уже есть более длинный список, и вы просто Если вы хотите перезаписать столько элементов, сколько у вас есть, вы можете использовать назначение фрагментов, например
new[roi][:len(ebt)] = ebt
Итак, применяя этот совет, ваш код упрощается до:
new = []
for row in rsfMRI_timeseries_2d:
new.append(np.take(row, find_bootstrap_indices).tolist())
Теперь перейдем к более Numpy -specifi c совету:
np.take(arr, indices)
делает интересную индексацию; В спецификациях c, если arr
является массивом Numpy и indices
является списком Python, это эквивалентно arr[indices]
- Normal Numpy индексирование возвращает новое представление в те же общие данные, но когда вы используете необычную индексацию, вы получаете копию данных (так что даже если вам нужна копия, вам не нужно явно копировать в этом случае)
Поскольку вы просто Если вы сделаете то же самое для каждой строки в rsfMRI_timeseries_2d
, и вызов np.take
также можно будет заменить индексированием, то весь l oop можно заменить на:
new = rsfMRI_timeseries_2d[:,find_bootstrap_indices].tolist()
Хотя, поскольку вы вы используете Numpy, вы, вероятно, захотите работать с массивами Numpy вместо вложенных Python списков - если это так, то все становится просто:
new = rsfMRI_timeseries_2d[:,find_bootstrap_indices]