Могу ли я получить представление о массиве по указанным индексам? (вид из "необычной индексации") - PullRequest
16 голосов
/ 26 февраля 2011

Мне нужен способ получить «причудливую индексацию» (y = x [[0, 5, 21]]), чтобы вернуть представление вместо копии.

У меня есть массив, но я хочу иметь возможность работать с подмножеством этого массива (указанным списком индексов) таким образом, чтобы изменения в этом подмножестве также помещались в нужные места в большом массив. Если я просто хочу что-то сделать с первыми 10 элементами, я могу просто использовать обычную нарезку y = x [0:10]. Это прекрасно работает, потому что регулярное нарезание возвращает представление. Проблема в том, что я не хочу 0:10, а произвольный набор индексов.

Есть ли способ сделать это?

Ответы [ 4 ]

14 голосов
/ 26 февраля 2011

Я не думаю, что есть способ обойти это. Насколько я понимаю, «необычное индексирование» всегда будет возвращать копию. Лучшее решение, которое я могу придумать, - это манипулировать y, а затем использовать те же причудливые индексы, чтобы потом изменить значения x:

ii = [0, 5, 21]
y = x[ii]
<manipulate y>
x[ii] = y
2 голосов
/ 26 апреля 2016

Вот возможный способ симулировать представление (некоторый синтаксический сахар), избегая явных операторов копирования в конце, используя «причудливый контекст представления». Вам нужно позаботиться о том, чтобы ваш код не изменял индексный массив в контексте

import contextlib

@contextlib.contextmanager
def fancy_index_view(arr, inds):
    # create copy from fancy inds
    arr_copy = arr[inds]

    # yield 'view' (copy)
    yield arr_copy

    # after context, save modified data
    arr[inds] = arr_copy

сейчас, фрагмент

import numpy as np
foo = np.random.random((22,2))
row_inds = [0,5,21]
barview = foo[row_inds]
barview[::] = 1
foo[row_inds] = barview

можно заменить на

import numpy as np
foo = np.random.random((22,2))
row_inds = [0,5,21]
with fancy_index_view(foo, row_inds) as barview:
    barview[::] = 1
2 голосов
/ 26 февраля 2011

Вы можете просто сделать:

y = x[[0,1,4]]
func(y)
x[[0,1,4]] = y

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

0 голосов
/ 10 января 2014

Теоретически вы можете создать объект, который выполняет роль «причудливого представления» в другом массиве, и я могу придумать множество вариантов его использования.Проблема состоит в том, что такой объект не будет совместим со стандартным NumPy механизмом.Весь скомпилированный код на языке C полагается на то, что данные доступны как внутренний продукт успехов и показателей.Обобщение этого кода для принципиально разных форматов компоновки данных было бы огромной задачей.Для проекта, который пытается принять вызов в этом направлении, проверьте Blaze континуума.

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