создать массив x-dim, используя функцию numpy.from, из функции с более чем x параметрами - PullRequest
2 голосов
/ 11 января 2012

Я хотел бы создать массив 2D (x, y) из 5d-функции, скажем, KMID ядра:

import numpy as np
def KMID(x,y,mumid,delta,cmid):
    rsq=(x-float(len(x))/2.+0.5)**2+(y-float(len(y))/2.+0.5)**2
    return cmid*np.exp(-mumid*np.sqrt(rsq))/(rsq+delta**2)

примерно так:

shape=256,256
midscatterkernel=np.fromfunction(KMID(:,:,0.1,0.2,0.3),shape)

Thisдает:

SyntaxError: неверный синтаксис

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

Ответы [ 2 ]

4 голосов
/ 11 января 2012

Не используйте np.fromfunction для этого, поскольку KMID может принимать массивы в качестве аргументов:

import numpy as np

def KMID(x, y, mumid, delta, cmid):
    rsq = (x-len(x)/2.+0.5)**2+(y-len(y)/2.+0.5)**2
    return cmid*np.exp(-mumid*np.sqrt(rsq))/(rsq+delta**2)

lenx, leny = 256, 256
midscatterkernel = KMID(
    np.arange(lenx),
    np.arange(leny)[:, np.newaxis],
    0.1, 0.2, 0.3)

(np.fromfunction - синтаксический сахар для медленного цикла Python. Если вы можете сделатьТо же самое с операциями с массивами numpy, используйте операции с массивами numpy. Это будет быстрее.)


Однако, чтобы ответить на ваш вопрос, нужно ли вам использовать np.fromfunction, но вы хотитенекоторые аргументы в качестве констант, то вы можете использовать functools.partial:

import functools
def KMID(x, y, mumid, delta, cmid):
    rsq = (x-len(x)/2.+0.5)**2+(y-len(y)/2.+0.5)**2
    return cmid*np.exp(-mumid*np.sqrt(rsq))/(rsq+delta**2)

shape = 256, 256
midscatterkernel = np.fromfunction(functools.partial(KMID,mumid=0.1,delta=0.2,cmid=0.3),shape)
3 голосов
/ 11 января 2012

KMID - это функция, а не массив, поэтому вы не можете индексировать ее с помощью :.Do

midscatterkernel=np.fromfunction(lambda x, y: KMID(x,y,0.1,0.2,0.3), shape)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...