用坐标函数初始化NumPy矩阵的最有效方法

时间:2019-01-26 18:26:39

标签: python numpy matrix

使用以坐标为参数的函数结果初始化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)))。

1 个答案:

答案 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.meshgridnp.mgrid也可以用于生成这些坐标。像这样与二维数组一起工作的函数不是任意的。但是,与numpy一起使用时,这是一个非常可取的特质。

您的问题,或者可能是对我们的问题的回答不足,意味着ij必须是标量的,因此要求每对i,j分别传递给功能。例如,j中可能使用了math.sin(j),或者该函数对ifi值进行了一些j测试。在这种情况下,fromfunction方法将失败。