Dear Thomas, I think you might be able to do this with https://numpy.org/doc/stable/reference/generated/numpy.lib.stride_tricks.sliding_window_view.html
Kind regards Klaus On Fri, Jul 26, 2024 at 2:51 PM <langt...@forwiss.uni-passau.de> wrote: > Dear all, > > my goal would be to apply some function on a local environment of size K x > K x K where K is bigger than 1 and odd. For example, if K = 3, it would be > nice to apply some function "func" on such an environment around each > n-dimensional position within the n-dimensional array. So, for K = 3 and > the position (1,1,1) if a 3D array, one would collect the array values at > the positions X = [(0,0,0),(0,0,1),(0,0,2),(0,1,0),...(2,2,2)] (K**3 = 27 > in total in this example) and yield those values to "func". The result > value at position (1,1,1) in the output array would be y = func(X). The > same would apply for all entries excluding the padding area (or according > to some padding policy). > > While I coded this many times on plain buffers in C++, I was wondering if > there would be an *efficient* way to do this in numpy? Up to now I relied > on the ndenumerate way of iterating n-dimensional arrays and aggregating > the values using slices, but this turns out to be unbearably slow even for > quite small arrays :-/ > Is there a better "numpy-isque" way to do this? I thought of writing a > custom view or subclassing, but the efficient aggregation of local > environments using the ndenumerate and slice approach is slow, yet in C/C++ > random access and native support for parallelism (by means of OpenMP) would > drastically accelerate this. > > Or would it even be preferred to add this functionality to the library? I > could imagine a special view, e.g., "LocalEnvironmentArrayView" or just a > simple function with the intended usage something like the following: > > * a = ... # some n-dimensional numpy array > * func = lambda env: np.mean(env) - np.std(env) > * w = numpy.apply_on_local_environments(a, func, environment_size=3) > > So, each entry in the interior (or also the boundary, depending on the > padding policy) of w would correspond to the evaluation of func on that > local environment. > > Best regards, > Thomas > _______________________________________________ > NumPy-Discussion mailing list -- numpy-discussion@python.org > To unsubscribe send an email to numpy-discussion-le...@python.org > https://mail.python.org/mailman3/lists/numpy-discussion.python.org/ > Member address: kzimmerm...@quansight.com >
_______________________________________________ NumPy-Discussion mailing list -- numpy-discussion@python.org To unsubscribe send an email to numpy-discussion-le...@python.org https://mail.python.org/mailman3/lists/numpy-discussion.python.org/ Member address: arch...@mail-archive.com