2016-04-12 4 views
0

У меня есть ndarray A, который хранит объекты одного типа, в частности различные объекты LinearNDInterpolator. Например, предположим, что это всего лишь 2:Оценить несколько элементов массива numpy объектов

>>> A 
array([ <scipy.interpolate.interpnd.LinearNDInterpolator object at 0x7fe122adc750>, 
     <scipy.interpolate.interpnd.LinearNDInterpolator object at 0x7fe11daee590>], dtype=object) 

Я хочу иметь возможность делать две вещи. Во-первых, я хотел бы оценить все объекты в A в определенный момент и вернуть ndarray из A.shape со всеми значениями в нем. Что-то вроде

>> A[[0,1]](1,1) = 
array([ 1, 2]) 

Однако я получаю

TypeError: 'numpy.ndarray' object is not callable 

Можно ли это сделать?

Во-вторых, я хотел бы изменить значения интерполяции без создания новых объектов LinearNDInterpolator (так как узлы остаются неизменными). Т.е., что-то вроде

A[[0,1]].values = B 

где B является ndarray, содержащий новые значения для каждого элемента А.

Спасибо за ваши предложения.

ответ

1

Та же проблема, но с более простыми функциями:

In [221]: A=np.array([add,multiply]) 

In [222]: A[0](1,2) # individual elements can be called 
Out[222]: 3 

In [223]: A(1,2) # but not the array as a whole 
---------------------------------------------------------------------------  
TypeError: 'numpy.ndarray' object is not callable 

Мы можем перебрать список функций, или этот массив, а также, вызывая каждый элемент по параметрам. Сделано правильно, мы можем даже закрепить список функций и список параметров.

In [224]: ll=[add,multiply] 

In [225]: [x(1,2) for x in ll] 
Out[225]: [3, 2] 

In [226]: [x(1,2) for x in A] 
Out[226]: [3, 2] 

Другого тест, callable функции:

In [229]: callable(A) 
Out[229]: False 

In [230]: callable(A[0]) 
Out[230]: True 

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

В общем, массивы объектов dtype функционируют как списки. Они содержат одинаковые указатели объектов. Для большинства операций требуется такая же итерация. Если вам не нужно организовывать элементы в нескольких измерениях, массивы объектов dtype имеют мало, если есть какие-либо преимущества перед списками.

Другая мысль - нормальный массив dtype - это числовые или фиксированные длины. Эти элементы не подлежат вызову, поэтому нет необходимости применять метод .__call__ для этих массивов. Они могли бы написать что-то подобное для работы с объектными массивами dtype, но основным действием является вызов Python. Таким образом, такая функция просто скроет вид итерации, которую я изложил.

В другом недавнем вопросе я показал, как использовать np.char.upper, чтобы применить строковый метод к каждому элементу массива dtype S. Но мои тесты времени показали, что это ничего не ускорило.

+0

Эй, спасибо за ваш ответ. Проблема в том, что массив n-мерный, поэтому было бы утомительно работать со списками или циклами. Мне удалось сделать первое, используя numpy.frompyfunc: я могу определить eval_element = lambda array: array (1,1), а затем определить eval_ufunc = np.frompyfunc (eval_element, 1, 1). eval_ufunc (A) затем возвращает ndarray каждого LinearNDinterpolator, evalutated at (1,1). – Tobias

+0

И да, вы можете изменить значения Interpolators, они сохраняются в атрибуте A [0] .values. – Tobias

+0

'frompyfunc' оценен.Я использовал его в нескольких ответах SO, например. http://stackoverflow.com/a/36297194/901925 – hpaulj

Смежные вопросы