我想創建一個 1920x1080 Numpy 陣列,其中每個索引的值取決于索引本身(例如 Array[x][y] = f(x,y))。
到目前為止,我一直在使用 for 回圈執行此操作,例如:
import numpy as np
xlength = 1920
ylength = 1080
def function(x,y):
return(x**2 y**2)
indexarray = np.zeros((ylength,xlength),dtype = float)
for y in range(ylength):
for x in range(xlength):
indexarray[y][x]=function(x,y)
但是,這對于我的目的來說太慢了。
有沒有更快的方法來做到這一點?我嘗試使用 map() 和 numpy.apply_over_axes() 將函式應用于預構建的陣列,其中每個陣列元素只是其 x 和 y 坐標的串列(如Array[x][y]=(x,y)),但我不知道如何使它們正常作業。
uj5u.com熱心網友回復:
你說話好像function需要標量輸入:
In [111]: xlength = 5
...: ylength = 6
...: def function(x,y):
...: return(x**2 y**2)
...: indexarray = np.zeros((ylength,xlength),dtype = float)
...: for y in range(ylength):
...: for x in range(xlength):
...: indexarray[y,x]=function(x,y)
...:
In [112]: indexarray.shape
Out[112]: (6, 5)
In [113]: indexarray
Out[113]:
array([[ 0., 1., 4., 9., 16.],
[ 1., 2., 5., 10., 17.],
[ 4., 5., 8., 13., 20.],
[ 9., 10., 13., 18., 25.],
[16., 17., 20., 25., 32.],
[25., 26., 29., 34., 41.]])
但它適用于陣列,例如 (6,1) 和 (5,) 形狀:
In [114]: np.arange(6)[:,None]**2 np.arange(5)**2
Out[114]:
array([[ 0, 1, 4, 9, 16],
[ 1, 2, 5, 10, 17],
[ 4, 5, 8, 13, 20],
[ 9, 10, 13, 18, 25],
[16, 17, 20, 25, 32],
[25, 26, 29, 34, 41]], dtype=int32)
如同:
function(np.arange(6)[:,None],np.arange(5))
有很多方法可以為這樣的函式生成陣列。另一個答案表明np.meshgrid。
fromfunction采用函式和形狀,并用于np.indices創建陣列。但它仍然只呼叫一次函式。
In [117]: np.fromfunction(function,(6,5))
Out[117]:
array([[ 0., 1., 4., 9., 16.],
[ 1., 2., 5., 10., 17.],
[ 4., 5., 8., 13., 20.],
[ 9., 10., 13., 18., 25.],
[16., 17., 20., 25., 32.],
[25., 26., 29., 34., 41.]])
np.indices((6,5)),np.meshgrid(np.arange(6),np.arange(5), indexing='ij')產生相同的 2 個陣列。也np.mgrid。
如果函式真的只接受標量,那么你就會陷入某種迭代,每次對每一x,y對都呼叫它。
假裝function只適用于標量,我們可以使用:
In [126]: f = np.vectorize(function, otypes=['float'])
In [127]: f(np.arange(6)[:,None], np.arange(5))
這仍然需要function每一x,y對。對于小例子,您的迭代速度更快,但對于非常大的情況,這vectorize會更好。但是,如果您可以撰寫函式直接使用陣列,請不要使用。
uj5u.com熱心網友回復:
要在網格上應用函式,請使用np.meshgrid:
import numpy as np
import matplotlib.pyplot as plt
def f(x, y):
return x**2 y**2
x = np.linspace(1, 1920, 1920)
y = np.linspace(1, 1080, 1080)
xx, yy = np.meshgrid(x, y, sparse=True)
plt.contourf(x, y, f(xx, yy))
plt.show()

同樣可以通過廣播實作,但使用網格還有
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488972.html
上一篇:Python不保存極坐標圖
下一篇:按值從nd-array中洗掉行
