2017-01-31 163 views
2

我已經生成了一個(x, y)值的numpy數組,作爲N x N網格。Numpy在2D陣列上運行以生成3D陣列

grid = np.meshgrid(np.linspace(0, 1, 50), np.linspace(0, 1, 50))[0] 
grid.shape // (50, 50, 1) 

我有一個函數,它需要兩個參數並返回3個值。 即(x, y) -> (a, b, c)

如何將函數應用於2d numpy數組以獲得3d numpy數組?

+2

目前還不清楚「(x,y)」數值在'N x N'網格上的樣子是什麼樣子......這是否暗示您有二維元組數組? – mgilson

回答

3

如果你的函數真的需要你可能想映射沒有2D到3D的兩個參數,而是2xMxN到3xMxN。對於這種改變你的第一線,像

gridx, gridy = np.meshgrid(np.linspace(0, 1, 50), np.linspace(0, 1, 50)) 

甚至使用更經濟的ix_還沒有交換軸

gridy, gridx = np.ix_(np.linspace(0, 1, 50), np.linspace(0, 1, 50)) 

的優勢,如果你的函數f不處理數組參數,然後爲@雅克·高丁指出np.vectorize可能就是你想要的。需要警告的是,vectorize主要是一種便利功能,它不會讓事情變得更快。它確實有用的東西像廣播這就是爲什麼使用ix_實際工作

f_wrapped = np.vectorize(f) 
result = f_wrapped(gridy, gridx) 

注意result你的情況是50×50陣列的3元組,即由輸出分組。如果要鏈接矢量化函數,這很方便。如果您希望全部在一個大陣列中,只需將result轉換爲array,並可選地使用transpose重新排列軸,例如,

triplets_last = np.array(result).transpose((1, 2, 0)) 
1

如果我理解正確,那麼您的裝修器就是np.vectorize之後。通過使用它,你可以在meshgrid上應用一個函數。你的函數應該只帶一個參數,因爲你不通過座標,而是座標值(除非值是兩個元素的tulpes)。

import numpy as np 

grid = np.meshgrid(np.linspace(0, 1, 5), np.linspace(0, 1, 5))[0] 

@np.vectorize 
def func(a): 
    return (a, a**.5, a**2) 

res = np.array(list(func(grid))) 
print(res.shape) 
print(res)