Если я использую numpy, я могу разрезать массив следующим образом:
import numpy as np
A = np.asarray([1, 2, 3, 4, 5])
print(A[np.asarray([1, 3])])
Тогда на выходе получается [2 4].
Интересно, могу ли я выполнить ту же операцию без использования numpy, когда А - это просто список.
@Divakar Извините за недоразумение. Я отредактировал вопрос, чтобы указать, что A - это список.






Вы можете сделать это, набрав немного больше текста, используя понимание списка:
print([A[n] for n in [1, 3]])
Спасибо, это будет хороший способ. Насколько быстро составлен список? Интересно, какой из них быстрее между вашим и numpy.
Понимание списков происходит быстро - намного быстрее, чем, например, добавление элементов в список по одному. Действительно ли использовать списки numpy или обычные, действительно зависит от вашего варианта использования, а не от этой единственной детали синтаксиса. Вам нужно будет измерить производительность самостоятельно, однозначного ответа нет.
@alexis Я бы не сказал «намного быстрее», но «немного быстрее». Не на порядки быстрее, как массив numpy
@ juanpa.arrivillaga Не могли бы вы уточнить, что вы имеете в виду, говоря «как массив из numpy»?
Я думаю, это означает, что если вы можете использовать numpy, он в целом будет быстрее, чем списки Python. В этом вся цель numpy.
Не говоря уже о numpy, вы уверены в этом @juanpa? По моему опыту, такой цикл, как for x in list_a: list_b.append(x), более чем незначительно медленнее, чем понимание.
Вот что я имею в виду точно: gist.github.com/juanarrivillaga/… настолько "маргинальный", как в случае меньше, чем numpy, например, вы все еще используете те же единицы времени. И чем сложнее становится то, что вы делаете внутри понимания списка, различия резко сокращаются. По сути, понимание списков оптимизирует добавление.
Обратите внимание: я обновил суть дополнительным примером, показывающим, как для небольших списков различия практически исчезли, потому что понимание списка создает объект функции под капотом, который имеет некоторые накладные расходы.
@juanpa, спасибо за демонстрацию. Я признаю, что разница меньше, чем я ожидал, но для небольших наборов данных все это не имеет значения - имеют значение только большие списки (а 1000 элементов - это скорее низкая сторона «большого»). Конечно, разница исчезает, когда вы делаете набор тестов настолько маленьким - то, что тестируется, займет лишь часть общего времени.
К сожалению, нет. Вы можете кусочек чистый список Python. Однако это не нарезка. Если вы попробуете это в списке, вы получите
TypeError: list indices must be integers or slices, not list
Это поддерживается массивами numpy, потому что они имеют другую реализацию метода __get__. Вы ничего не можете с этим поделать, кроме как самостоятельно создать подкласс класса list (чего на самом деле не следует, реализация numpy оптимизирована для таких операций).
....
A[[1,3]]?