[Numpy-discussion] Optimize evaluation of function on matrix

Florian Lindner mailinglists at xgm.de
Mon Mar 27 07:06:21 EDT 2017


Hey,

I've timed the two versions, one basisfunction being a function:

1 loop, best of 3: 17.3 s per loop

the other one, basisfunction being a list of functions:

1 loop, best of 3: 33.5 s per loop

> To be honest, I am a bit surprised that its a problem, since "basis
> function" sounds a bit like you have to do this once and then use the
> result many times.

It's part of a radial basis function interpolation algorithm. Yes, in practice the matrix is filled only once and reused
a couple of times, but in my case, which is exploration of parameters for the algorithm, I call eval_BF many times.

> You can get rid of the `row` loop though in case row if an individual
> row is a pretty small array.

Would you elaborate on that? Do you mean that the inner col loop produces an array which is then assigned to the row.
But I think it stell need to row loop there.

Best,
Florian

Am 25.03.2017 um 22:31 schrieb Sebastian Berg:
> On Sat, 2017-03-25 at 18:46 +0100, Florian Lindner wrote:
>> Hello,
>>
>> I have this function:
>>
>> def eval_BF(self, meshA, meshB):
>>         """ Evaluates single BF or list of BFs on the meshes. """
>>         if type(self.basisfunction) is list:
>>             A = np.empty((len(meshA), len(meshB)))
>>             for i, row in enumerate(meshA):
>>                 for j, col in enumerate(meshB):
>>                     A[i, j] = self.basisfunction[j](row - col)
>>         else:
>>             mgrid = np.meshgrid(meshB, meshA)
>>             A = self.basisfunction( np.abs(mgrid[0] - mgrid[1]) )
>>         return A
>>
>>
>> meshA and meshB are 1-dimensional numpy arrays. self.basisfunction is
>> e.g.
>>
>> def Gaussian(radius, shape):
>>     """ Gaussian Basis Function """
>>     return np.exp( -np.power(shape*abs(radius), 2))
>>
>>
>> or a list of partial instantations of such functions (from
>> functools.partial).
>>
>> How can I optimize eval_BF? Esp. in the case of basisfunction being a
>> list.
>>
> 
> Are you sure you need to optimize it? If they have a couple of hundred
> elements or so for each row, the math is probably the problem and most
> of that might be the `exp`.
> You can get rid of the `row` loop though in case row if an individual
> row is a pretty small array.
> 
> To be honest, I am a bit surprised that its a problem, since "basis
> function" sounds a bit like you have to do this once and then use the
> result many times.
> 
> - Sebastian
> 
> 
>> Thanks!
>> Florian
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at python.org
>> https://mail.python.org/mailman/listinfo/numpy-discussion
>>
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at python.org
>> https://mail.python.org/mailman/listinfo/numpy-discussion

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20170327/3eabacca/attachment.sig>


More information about the NumPy-Discussion mailing list