#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]
вам все равно может быть предоставлена копия, и вы можете изменить исходный массив.