Изменение расширенного индексированного подмножества массива NumPy на месте - PullRequest
3 голосов
/ 06 ноября 2010

У меня есть recarray с парой столбцов, которые я использую для выбора подмножества.Что-то вроде

>>> x
   array([ ('label1',True,3),
          ('label2',True,2),
          ('label1',False,4)],
         dtype=[('status', '|S16'), ('select', '|b1'), ('somedata', '<i4')])

Данные выбираются из этого массива с использованием подхода, аналогичного предыдущему вопросу SO .

condit=(x['status']=='label1')&(x['select']==True)
x_subids=numpy.where(condit)[0]
x_sub=x[x_subids]

Затем я выполняю некоторую работу над подмножествоми обновите оригинал.

x[x_subids]=x_sub

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

Ответы [ 2 ]

3 голосов
/ 09 ноября 2010

Вид изменений, которые вы упоминаете в комментариях к моему первому ответу, может быть выполнен с помощью функции numpy.place() :

>>> import numpy
>>> x = numpy.array([("label1",True,3), ("label2",False,2), ("label1",True,4)],
...     dtype=[("status", "|S16"), ("select", "|b1"), ("somedata", ">> mask = x["select"]
>>> numpy.place(x["somedata"], mask, (5, 6))
>>> print x
[('label1', True, 5) ('label2', False, 2) ('label1', True, 6)]
>>> numpy.place(x["status"], mask, "label3")
>>> print x
[('label3', True, 5) ('label2', False, 2) ('label3', True, 6)]

Обратите внимание, что

  1. Я немного изменил значения и условия ради соответствующего примера.

  2. На этот раз значения, где mask равно True, выбираются снова,не замаскированы, как в моем предыдущем ответе.

  3. ==True часть в вашей маске condit является избыточной, просто оставьте ее:)

2 голосов
/ 07 ноября 2010

Вы можете использовать «маскированный массив»:

masked = numpy.ma.array(x, 
                        mask=(x['status']!='label1')|(x['select']!=True),
                        copy=False)

Обратите внимание, что маска обратна вашей condit, так как значения, где маска True, маскируются. Теперь вы можете применить любой скрытый ufunc к этому замаскированному массиву, и это повлияет только на немаскированные значения.

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