使用以坐标为参数的函数结果初始化NumPy矩阵的最有效方法是什么?
目前,我只知道如何使用双循环来完成此操作,但是我听说它通常不适用于NumPy矩阵。
M = np.zeros((1000,1000))
for i in range(1000):
for j in range(1000):
M[i][j] = f(i,j) #where f is the desired function
是否有更好的方法来实现具有任意坐标函数结果的NumPy矩阵?
我认为该函数实际上取决于两个参数。没有f(x,y) = h(x)g(y)
的函数g和h。
(原始:f(x,y) = h(g(x,y))
)。
答案 0 :(得分:2)
问题和接受的答案之间存在严重的不匹配。 fun
不是坐标的任意函数。这是一个完全的“向量化”向量,可以接受可广播的数组。
In [195]: def fun(i,j): return i*j-j**2
In [196]:
In [196]: np.fromfunction(fun, (4,4))
Out[196]:
array([[ 0., -1., -4., -9.],
[ 0., 0., -2., -6.],
[ 0., 1., 0., -3.],
[ 0., 2., 2., 0.]])
In [197]: fun(np.arange(4)[:,None], np.arange(4))
Out[197]:
array([[ 0, -1, -4, -9],
[ 0, 0, -2, -6],
[ 0, 1, 0, -3],
[ 0, 2, 2, 0]])
所有fromfunction
所做的都是生成一整套坐标,并将结果数组传递给您的函数:
In [199]: np.indices((4,4))
Out[199]:
array([[[0, 0, 0, 0],
[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]],
[[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3]]])
np.meshgrid
和np.mgrid
也可以用于生成这些坐标。像这样与二维数组一起工作的函数不是任意的。但是,与numpy
一起使用时,这是一个非常可取的特质。
您的问题,或者可能是对我们的问题的回答不足,意味着i
和j
必须是标量的,因此要求每对i,j
分别传递给功能。例如,j
中可能使用了math.sin(j)
,或者该函数对if
或i
值进行了一些j
测试。在这种情况下,fromfunction
方法将失败。