我已經生成了一個(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數組?
我已經生成了一個(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數組?
如果你的函數真的需要你可能想映射沒有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))
如果我理解正確,那麼您的裝修器就是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)
目前還不清楚「(x,y)」數值在'N x N'網格上的樣子是什麼樣子......這是否暗示您有二維元組數組? – mgilson