#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, помогает мне признать, что в этом случае цикл неизбежен.