Переназначить несколько записей в массив записей?

#python #numpy

#python #numpy

Вопрос:

Я хочу применить преобразование к определенным столбцам массива записей и переназначить эти значения. Каков канонический способ сделать это?

 List = [['a',.3,.3],
        ['b',-.5,.4]]

Arr = np.rec.fromrecords(List,names=['id','var1','var2'])
  

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

 scale = lambda x: x - x.mean(0)
  

Это не работает

 Arr[['var1','var2']].mean(0)
TypeError: cannot perform reduce with flexible type
  

Итак, сначала я должен преобразовать в неструктурированный массив, но затем как переназначить обратно в массив записей? Должен ли я выполнять цикл?

 Unstr = Arr[['var1','var2']].view('float').reshape(len(Arr),-1)

Arr[['var1','var2']] = scale(Unstr)

IndexError: unsupported iterator index
  

Комментарии:

1. Хороший ник для питониста 🙂

2. Спасибо! Да, удар был направлен на Python … 😉

Ответ №1:

Почему вы не масштабируете переменные одну за другой?

 In [13]: %paste
import numpy as np

List = [['a',.3,.3],
        ['b',-.5,.4]]

scale = lambda x: x - x.mean()
Arr = np.rec.fromrecords(List,names=['id','var1','var2'])

vars_to_scale = ['var1', 'var2']
for var in vars_to_scale:
    Arr[var] = scale(Arr[var])
print Arr
## -- End pasted text --
[('a', 0.4, -0.04999999999999999) ('b', -0.4, 0.050000000000000044)]
  

Комментарии:

1. Правильно, так вот как это должно быть сделано… с помощью цикла? Это был очевидный способ, но я подумал, numpy что он будет достаточно высокоуровневым, чтобы позволить мне избежать таких конструкций (в противном случае он не предлагает большого значения выше fortran / C ?).

2. Что ж, работа с numpy.ndarray обеспечивает достаточно высокий уровень, чтобы превзойти оба Fortran и C . Но, AFAIK, numpy.recarray это структура, состоящая из нескольких массивов. Вы можете просматривать несколько массивов как один, но вы не можете работать с несколькими массивами одновременно, особенно вы не можете назначить последовательность массивов одному массиву. Также Дзен Python учит, что явное лучше неявного, а что может быть явнее цикла ? 🙂

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