Нарезка массива Numpy с использованием списка

#python #numpy

#python #numpy

Вопрос:

Рассмотрим 2D массив Numpy A и функцию на месте x , например

 A = np.arange(9).reshape(3,3)
def x(M):
    M[:,2] = 0
 

Теперь у меня есть список (или 1D массив numpy) L , указывающий строки, я хочу выбрать и применить к ним функцию f , например

 L = [0, 1]
x(A[L, :])
 

где выходные данные будут записаны в A. Поскольку я использовал индексный доступ к A, на матрицу A это никак не влияет:

 A = array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
 

Что мне действительно нужно, так это нарезать матрицу, например

 x(A[:2, :])
 

предоставление мне желаемого результата

 A = array([[0, 1, 0],
           [3, 4, 0],
           [6, 7, 8]])
 

Теперь вопрос в том, как обеспечить нарезку массива Numpy по списку L (либо любое автоматическое преобразование списка в срез, либо если для этого есть какая-либо встроенная функция), потому что я не могу легко преобразовать список L в срез, как :2 в этом случае.

Обратите внимание, что в моей проблеме у меня есть как большая матрица A , так и список L — вот причина, по которой мне понадобятся операции на месте для управления доступной памятью.

Комментарии:

1. Вам нужно создать функцию для этого? Почему бы не присваивать значения напрямую путем нарезки без функции?

2. Причина в том, что моя функция намного сложнее, чем M[:,2] = 0

3. Будет ли передача списка и массива в качестве входных данных для функции работать?

4. Я не понимаю вопроса — функция x работает с 2D массивом Numpy, как в примере выше

5. Всегда ли список чисел является последовательным числом?

Ответ №1:

Можете ли вы изменить функцию так, чтобы вы могли передавать фрагмент L внутри нее:

 def func(M,L): 
    M[L,2] = 0

func(A,L)

print(A)
 

Выход:

 array([[0, 1, 0],
       [3, 4, 0],
       [6, 7, 8]])
 

Комментарии:

1. Спасибо за ответ. Я обнаружил, что действительно невозможно создать фрагмент из списка в целом (например scipy-cookbook.readthedocs.io/items/ViewsVsCopies.html ). Альтернативным решением (и, возможно, предпочтительным для меня) является перестановка строк A таким образом, чтобы L ссылаться на последовательную последовательность в переставленной матрице.

2. @PavelProchazka нет, AFAIK, даже тогда A[:3][:2] вам все равно может быть предоставлена копия, и вы можете изменить исходный массив.