Получение массивного представления с целочисленной или логической индексацией - PullRequest
6 голосов
/ 18 октября 2019

numpy массивы могут быть частично назначены с использованием целочисленных или логических индексов, таких как:

import numpy as np
x = np.arange(5)
x[[2,4]]=0
x
## array([0., 0., 1., 0., 1.])
x[[True]*2+[False]*3]=2
x
## array([2., 2., 1., 0., 1.])

Однако, даже если x[[2,4]] находится в значении lvalue в этом контексте, значение lvalue не может быть назначено другой переменнойпотому что в этом случае присваивание выполняется с помощью __setitem__, тогда как __getitem__ при передаче целочисленного или логического списка создает копию:

x = np.arange(5)
y = x[[2,4]]
y[:] = 1
x
array([0., 0., 0., 0., 0.])

Вопрос: есть ли простой / чистый способполучить доступное для записи представление массива на основе подмножества индекса с целым или логическим индексом? Под «простым / чистым» я подразумеваю, что я хочу избежать написания нового класса или отслеживания подиндексов самостоятельно. В основном я ищу какую-то numpy функцию или трюк, которые мне не удалось найти в Google.

Смысл этого вопроса в том, чтобы сделать это рекурсивно, чтобы иметь возможность создавать функции, которыеприсваивать части массива, просто передавая вокруг представления ракурса, а не передавая индексы и базовый массив.

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Хорошее объяснение вашего вопроса здесь :

Вы можете создавать представления, выбрав фрагмент исходного массива или также изменив тип d (или комбинациюобе). Основное правило для создания вида среза заключается в том, что к просматриваемым элементам можно обращаться со смещениями, шагами и счетчиками в исходном массиве. (...)

Причина, по которой причудливое индексирование не возвращает представление, состоит в том, что, как правило, его нельзя выразить как фрагмент (в указанном выше смысле возможности адресации со смещениями,делает успехи и считает)

Например, необычное индексирование для могло бы быть выражено как, но это невозможно сделать с помощью среза. Вот почему вместо этого возвращается объект с копией исходных данных.

Так что, как правило, нет , вы не можете.

По моему мнению, самый "тупой" способ работы с представлениями - это работать с масками и отслеживать их, а не присваивать представления новой переменной. Я бы просто сделал:

m = [2, 4]
x[m] = some_function(x[m]) # whatever you need to do
2 голосов
/ 18 октября 2019

Вопрос: есть ли простой / чистый способ получить представление массива с возможностью записи на основе подмножества индекса с целым или логическим индексом?

Нет.

Массивы NumPy (и представления) должны иметь постоянные шаги (т. Е. Расстояние между элементами в памяти должно быть постоянным). Если ваша операция индексирования создаст объект, который нарушает это ограничение, вам не повезло.

См., Например, здесь для обсуждения связанной проблемы:

Вы не можете в модели NumPy памяти. Модель памяти NumPy определяет массив как нечто, имеющее регулярные шаги для перехода от элемента к следующему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...