numpy中是否有多维版本的arange/linspace?

Hil*_*oer 53 python numpy cartesian-product

我想要一个2d numpy数组(x,y)的列表,其中每个x在{-5,-4.5,-4,-3.5,...,3.5,4,4.5,5}中,并且对于y是相同的.

我可以

x = np.arange(-5, 5.1, 0.5)
y = np.arange(-5, 5.1, 0.5)
Run Code Online (Sandbox Code Playgroud)

然后迭代所有可能的对,但我确信有一个更好的方式......

我希望回来看起来像:

[[-5, -5],
 [-5, -4.5],
 [-5, -4],
 ...
 [5, 5]]
Run Code Online (Sandbox Code Playgroud)

但顺序并不重要.

far*_*rth 56

你可以使用np.mgrid它,它通常比np.meshgrid一步创建数组更方便:

import numpy as np
X,Y = np.mgrid[-5:5.1:0.5, -5:5.1:0.5]
Run Code Online (Sandbox Code Playgroud)

对于类似linspace的功能,将步骤(ie 0.5)替换为复数,其大小指定系列中所需的点数.使用此语法,将上述相同的数组指定为:

X, Y = np.mgrid[-5:5:21j, -5:5:21j]
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建对:

xy = np.vstack((X.flatten(), Y.flatten())).T
Run Code Online (Sandbox Code Playgroud)

正如@ali_m建议的那样,这一切都可以在一行中完成:

xy = np.mgrid[-5:5.1:0.5, -5:5.1:0.5].reshape(2,-1).T
Run Code Online (Sandbox Code Playgroud)

祝你好运!

  • ......或作为单线,`xy = np.mgrid [-5:5.1:0.5,-5:5.1:0.5] .reshape(2,-1).T` (12认同)

tmd*_*son 10

我想你想要np.meshgrid:

从坐标向量返回坐标矩阵.

在给定一维坐标数组x1,x2,...,xn的情况下,使ND坐标数组用于ND网格上的ND标量/矢量场的矢量化评估.

import numpy as np
x = np.arange(-5, 5.1, 0.5)
y = np.arange(-5, 5.1, 0.5)
X,Y = np.meshgrid(x,y)
Run Code Online (Sandbox Code Playgroud)

您可以将其转换为您想要的输出

XY=np.array([X.flatten(),Y.flatten()]).T

print XY
array([[-5. , -5. ],
       [-4.5, -5. ],
       [-4. , -5. ],
       [-3.5, -5. ],
       [-3. , -5. ],
       [-2.5, -5. ],
       ....
       [ 3. ,  5. ],
       [ 3.5,  5. ],
       [ 4. ,  5. ],
       [ 4.5,  5. ],
       [ 5. ,  5. ]])
Run Code Online (Sandbox Code Playgroud)


cht*_*mon 7

如果您只想遍历对(而不是一次对整个点集进行计算),则最好itertools.product遍历所有可能的对:

import itertools

for (xi, yi) in itertools.product(x, y):
    print(xi, yi)
Run Code Online (Sandbox Code Playgroud)

这避免了通过 生成大型矩阵meshgrid


Pra*_*shi 5

我们可以使用排列功能:

z1 = np.array([np.array(np.arange(1,5)),np.array(np.arange(1,5))])
print(z1)
o/p=> [[1 2 3 4]
       [1 2 3 4]]
Run Code Online (Sandbox Code Playgroud)


小智 5

这就是您要寻找的:

matr = np.linspace((1,2),(10,20),10)
Run Code Online (Sandbox Code Playgroud)

这意味着:

对于第一列;从(1,2)的1到(10,20)的10,将递增的10数放入。

对于第二栏;从(1,2)的2到(10,20)的20,将递增10的数字放入。

结果将是:

[[ 1.  2.]
 [ 2.  4.]
 [ 3.  6.]
 [ 4.  8.]
 [ 5. 10.]
 [ 6. 12.]
 [ 7. 14.]
 [ 8. 16.]
 [ 9. 18.]
 [10. 20.]]
Run Code Online (Sandbox Code Playgroud)

您也可以只增加一列的值,例如,如果您说:

matr = np.linspace((1,2),(1,20),10)
Run Code Online (Sandbox Code Playgroud)

第一列将从(1,2)的1到(1,20)的1十次,这意味着它将保持为1,结果将是:

[[ 1.  2.]
 [ 1.  4.]
 [ 1.  6.]
 [ 1.  8.]
 [ 1. 10.]
 [ 1. 12.]
 [ 1. 14.]
 [ 1. 16.]
 [ 1. 18.]
 [ 1. 20.]]
Run Code Online (Sandbox Code Playgroud)

  • 这不是二维的。 (5认同)