使用元素作为索引的函数创建一个numpy矩阵

Pet*_*ete 5 python numpy matrix

如何创建一个numpy矩阵,其元素是其索引的函数?例如,乘法表:a[i,j] = i*j

Un-numpy和un-pythonic将创建一个零数组然后循环.

毫无疑问,有一种更好的方法可以做到这一点,没有循环.

然而,更好的是直接创建矩阵.

sen*_*rle 8

这是一种方法:

>>> indices = numpy.indices((5, 5))
>>> a = indices[0] * indices[1]
>>> a
array([[ 0,  0,  0,  0,  0],
       [ 0,  1,  2,  3,  4],
       [ 0,  2,  4,  6,  8],
       [ 0,  3,  6,  9, 12],
       [ 0,  4,  8, 12, 16]])
Run Code Online (Sandbox Code Playgroud)

为了进一步说明,numpy.indices((5, 5))生成两个包含5x5数组的x和y索引的数组,如下所示:

>>> numpy.indices((5, 5))
array([[[0, 0, 0, 0, 0],
        [1, 1, 1, 1, 1],
        [2, 2, 2, 2, 2],
        [3, 3, 3, 3, 3],
        [4, 4, 4, 4, 4]],

       [[0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4],
        [0, 1, 2, 3, 4]]])
Run Code Online (Sandbox Code Playgroud)

当你将这两个数组相乘时,numpy将每个位置的两个数组的值相乘并返回结果.


gag*_*nso 5

一个通用的解决方案是使用np.fromfunction()

从文档:

numpy.fromfunction(function, shape, **kwargs)

通过在每个坐标上执行一个函数来构造一个数组。因此,所得数组在坐标(x,y,z)处具有值fn(x,y,z)。

下一行应提供所需的矩阵。

numpy.fromfunction(lambda i, j: i*j, (5,5))

输出:

array([[  0.,   0.,   0.,   0.,   0.],
       [  0.,   1.,   2.,   3.,   4.],
       [  0.,   2.,   4.,   6.,   8.],
       [  0.,   3.,   6.,   9.,  12.],
       [  0.,   4.,   8.,  12.,  16.]])
Run Code Online (Sandbox Code Playgroud)

函数的第一个参数是可调用的,可为每个坐标执行。如果foo是您作为第一个参数传递的函数,foo(i,j)则将是的值(i,j)。这也适用于更高的尺寸。可以使用shape参数修改坐标数组的形状。

  • 这不适用于涉及复杂操作/逻辑的函数。这是因为“numpy”不会为每个坐标调用您的函数,而是仅将 x 和 y 坐标作为数组传入一次。例如,如果您想使用以下函数构造一个矩阵:“lambda x,y: 2*x if x > y else y/2”。在这种情况下,朴素方法真的是唯一的选择吗? (2认同)