创建二维范围

Create 2-dimensional range

我有一个起始值 X 的列向量和一个结束值 Z 的列向量,我想创建一个矩阵,在 XZ 大小 n。有没有办法直接生成它而不用迭代?

n=10,这个简单例子中的Z只是20的向量。然后,下面的代码

X = np.arange(0,5,1)

Y = np.empty((5, 10))
for idx in range(0, len(X)):
    Y[idx] = np.linspace(X[idx], 20, 10)

生成我想要的,但是需要迭代。有没有更高效的解决方案,或者没有所有自己动手逻辑的直接内置解决方案?

这是我的测试用例的预期输出:

Y
array([[  0.        ,   2.22222222,   4.44444444,   6.66666667,
          8.88888889,  11.11111111,  13.33333333,  15.55555556,
         17.77777778,  20.        ],
       [  1.        ,   3.11111111,   5.22222222,   7.33333333,
          9.44444444,  11.55555556,  13.66666667,  15.77777778,
         17.88888889,  20.        ],
       [  2.        ,   4.        ,   6.        ,   8.        ,
         10.        ,  12.        ,  14.        ,  16.        ,
         18.        ,  20.        ],
       [  3.        ,   4.88888889,   6.77777778,   8.66666667,
         10.55555556,  12.44444444,  14.33333333,  16.22222222,
         18.11111111,  20.        ],
       [  4.        ,   5.77777778,   7.55555556,   9.33333333,
         11.11111111,  12.88888889,  14.66666667,  16.44444444,
         18.22222222,  20.        ]])

这就是 np.meshgrid 的用途。编辑:没关系,这不是你想要的。

这是你想要的:

>>> X = np.arange(0, 5, 1)[:, None]
>>> Y = np.linspace(0, 1, 10)[None, :]
>>> X+Y*(20-X)
array([[  0.        ,   2.22222222,   4.44444444,   6.66666667,
      8.88888889,  11.11111111,  13.33333333,  15.55555556,
     17.77777778,  20.        ],
   [  1.        ,   3.11111111,   5.22222222,   7.33333333,
      9.44444444,  11.55555556,  13.66666667,  15.77777778,
     17.88888889,  20.        ],
   [  2.        ,   4.        ,   6.        ,   8.        ,
     10.        ,  12.        ,  14.        ,  16.        ,
     18.        ,  20.        ],
   [  3.        ,   4.88888889,   6.77777778,   8.66666667,
     10.55555556,  12.44444444,  14.33333333,  16.22222222,
     18.11111111,  20.        ],
   [  4.        ,   5.77777778,   7.55555556,   9.33333333,
     11.11111111,  12.88888889,  14.66666667,  16.44444444,
     18.22222222,  20.        ]])

列表理解至少更快,有时比循环更容易理解(另外,几乎总是使用 xrange 而不是 range,顺便说一句):

matrix = np.array([np.linspace(x, 20, 10) for x in X])