Массив NumPy для непоследовательных элементов - PullRequest
1 голос
/ 27 ноября 2011

У меня есть 1D массив numpy, содержащий комплексные числа (например, numpy.complex64). Мне нужно создать представления для этого массива, но я не знаю, как создать представление, учитывая список или диапазон индексов , чтобы включить в представление .

>>> myArray = np.ndarray(shape=(1000,), dtype=np.complex64)

Я знаю, как создать представление для последовательных элементов, например, первых 100 элементов:

>>> myView = myArray[:100]

Как я экспериментировал, невозможно создать представление для отдельного элемента, такого как myArray [2], потому что, если бы я изменил это значение, он не изменил бы базовый массив. Это нормально, но я надеюсь, что есть способ построить представление из нескольких произвольных индексов, поэтому такая функция была бы великолепна:

>>> myView = createView(myArray, indices=(0, 1, 6, 7, 13))

, который возвращает представление, которое указывает на те индексы, которые указаны в списке (или любой итерируемой форме), и если я изменю myView, он изменит myArray, как и должно быть.

Возможно ли это, или есть разумный обходной путь? Спасибо

редактировать

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

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

Ответы [ 3 ]

2 голосов
/ 27 ноября 2011

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

0 голосов
/ 18 сентября 2012

Следующий запрос демонстрирует OP:

>>> a = numpy.array(xrange(103,114))
>>> a
array([103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113])
>>> view = numpy.array([2,6,7,9])
>>> a[view]
array([105, 109, 110, 112])
>>> a[view] += 9999
>>> a
array([  103,   104, 10104,   106,   107,   108, 10108, 10109,   111,
       10111,   113])
0 голосов
/ 27 ноября 2011

Насколько я знаю, представления на ndarray генерируются так: myArray.view (dtype).Вот документация: http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.view.html

Она не отвечает на вашу проблему непоследовательных элементов, но я думаю, что это хорошее начало.

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

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