Mapping element-wise a NumPy array into an array of more dimensions

匿名 (未验证) 提交于 2019-12-03 01:38:01

问题:

I want map a numpy.array from NxM to NxMx3, where a vector of three elements is a function of the original entry:

lambda x: [f1(x), f2(x), f3(x)]

However, things like numpy.vectorize do not allow to change dimensions. Sure, I can create an array of zeros and make a loop (and it is what I am doing by now), but it does not sound neither Pythonic nor efficient (as every looping in Python).

Is there a better way to perform an elementwise operation on numpy.array, producing a vector for each entry?

回答1:

Now that I see your code, for most simple mathematical operations you can let numpy do the looping, what is often referred to as vectorization:

def complex_array_to_rgb(X, theme='dark', rmax=None):     '''Takes an array of complex number and converts it to an array of [r, g, b],     where phase gives hue and saturaton/value are given by the absolute value.     Especially for use with imshow for complex plots.'''     absmax = rmax or np.abs(X).max()     Y = np.zeros(X.shape + (3,), dtype='float')     Y[..., 0] = np.angle(X) / (2 * pi) % 1     if theme == 'light':         Y[..., 1] = np.clip(np.abs(X) / absmax, 0, 1)         Y[..., 2] = 1     elif theme == 'dark':         Y[..., 1] = 1         Y[..., 2] = np.clip(np.abs(X) / absmax, 0, 1)     Y = matplotlib.colors.hsv_to_rgb(Y)     return Y

This code should run much faster than yours.



回答2:

If I understand your problem correctly, I suggest you use np.dstack:

Docstring: Stack arrays in sequence depth wise (along third axis).  Takes a sequence of arrays and stack them along the third axis to make a single array. Rebuilds arrays divided by `dsplit`. This is a simple way to stack 2D arrays (images) into a single 3D array for processing.

    In [1]: a = np.arange(9).reshape(3, 3)      In [2]: a     Out[2]:      array([[0, 1, 2],            [3, 4, 5],            [6, 7, 8]])      In [3]: x, y, z = a*1, a*2, a*3  # in your case f1(a), f2(a), f3(a)       In [4]: np.dstack((x, y, z))     Out[4]:      array([[[ 0,  0,  0],             [ 1,  2,  3],             [ 2,  4,  6]],             [[ 3,  6,  9],             [ 4,  8, 12],             [ 5, 10, 15]],             [[ 6, 12, 18],             [ 7, 14, 21],             [ 8, 16, 24]]])


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!