numpy:多维linspace

时间:2018-04-03 22:55:04

标签: python arrays numpy

numpy.linspace是一维线性渐变。例如:numpy.linspace(0,3,4):

[0, 1, 2, 3]

很容易想象出二维线性渐变:

[[[0, 0], [1, 0], [2, 0], [3, 0]],
 [[0, 1], [1, 1], [2, 1], [3, 1]],
 [[0, 2], [1, 2], [2, 2], [3, 2]],
 [[0, 3], [1, 3], [2, 3], [3, 3]]]

我需要的是使用numpy的3维甚至4维线性渐变。

我可以使用Python代码轻松实现它,但速度太慢了。

%time arr = numpy.array([
    [
        [
            (a, b, c)
            for a in range(65)
        ]
        for b in range(65)
    ]
    for c in range(65)
])
Wall time: 177 ms

arr.shape
(65, 65, 65, 3)

1 个答案:

答案 0 :(得分:2)

有许多工具可以执行此操作 - np.meshgridnp.indices

numpy/lib/index_tricks.py有许多“可爱”的函数和类可以执行以下操作:

In [387]: np.mgrid[0:3:4j, 0:3:4j]
Out[387]: 
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.]]])

交换轴以获得您显示的布局:

In [391]: IJ.transpose(1,2,0)
Out[391]: 
array([[[0., 0.],
        [0., 1.],
        [0., 2.],
        [0., 3.]],

       [[1., 0.],
        [1., 1.],
        [1., 2.],
        [1., 3.]],

       [[2., 0.],
        [2., 1.],
        [2., 2.],
        [2., 3.]],

       [[3., 0.],
        [3., 1.],
        [3., 2.],
        [3., 3.]]])
In [392]: _.shape
Out[392]: (4, 4, 2)

另一个:np.array(list(np.ndindex((4,4)))).reshape(4,4,2)np.array(list(itertools.product(range(4),range(4)))).reshape(4,4,2)