我想要一个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)
然后迭代通过所有可能的配对,但我相信有更好的方法…
我希望得到类似于以下内容:
[[-5, -5],
[-5, -4.5],
[-5, -4],
...
[5, 5]]
但是顺序并不重要。
我想要一个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)
然后迭代通过所有可能的配对,但我相信有更好的方法…
我希望得到类似于以下内容:
[[-5, -5],
[-5, -4.5],
[-5, -4],
...
[5, 5]]
但是顺序并不重要。
np.mgrid
来实现此功能,它通常比 np.meshgrid
更方便,因为它可以一步创建数组:import numpy as np
X,Y = np.mgrid[-5:5.1:0.5, -5:5.1:0.5]
如果需要类似于linspace的功能,请使用复数(例如0.5j)代替步长。复数的幅度指定了你想要在序列中有多少个点。使用这种语法,可以将与上述相同的数组指定为:
X, Y = np.mgrid[-5:5:21j, -5:5:21j]
xy = np.vstack((X.flatten(), Y.flatten())).T
xy = np.mgrid[-5:5.1:0.5, -5:5.1:0.5].reshape(2,-1).T
祝你好运!
xy = np.mgrid[-5到5.1间隔0.5, -5到5.1间隔0.5].reshape(2, -1).T
,翻译后的代码与原代码意思相同,但更加通俗易懂。 - ali_m这正是您正在寻找的内容:
matr = np.linspace((1,2),(10,20),10)
这意味着:
对于第一列; 从(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.]]
您也可以仅保持一列值的增加,例如,如果您说:
matr = np.linspace((1,2),(1,20),10)
第一列将从(1,2)中的1到(1,20)中的1进行10次,这意味着它将保持为1,结果将为:
[[ 1. 2.]
[ 1. 4.]
[ 1. 6.]
[ 1. 8.]
[ 1. 10.]
[ 1. 12.]
[ 1. 14.]
[ 1. 16.]
[ 1. 18.]
[ 1. 20.]]
np.meshgrid
: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)
你可以使用以下方法将其转换为所需的输出:
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. ]])
如果你只想遍历一组组数值对(而不是对整个点集进行计算),最好使用 itertools.product
遍历所有可能的组合:
import itertools
for (xi, yi) in itertools.product(x, y):
print(xi, yi)
meshgrid
生成大型矩阵。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]]
np.array(np.arange(
? - CristiFati这是一种优雅的做法:
xy = [(i,j) for i in np.linspace(1,4,4) for j in np.linspace(0,2,3)]
print(xy)
的输出结果:[(1.0, 0.0),
(1.0, 1.0),
(1.0, 2.0),
(2.0, 0.0),
(2.0, 1.0),
(2.0, 2.0),
(3.0, 0.0),
(3.0, 1.0),
(3.0, 2.0),
(4.0, 0.0),
(4.0, 1.0),
(4.0, 2.0)]
import numpy as np
x = np.arange(-5, 5.1, 0.5)
X, Y = np.meshgrid(x, x)
Liszt = [np.array(thing) for thing in zip(X.flatten(), Y.flatten())] # for python 2.7
zip
会给你一个元组列表,而列表推导式则完成其余部分。
我仍然使用 Linspace,因为我更喜欢坚持使用这个命令。
您可以创建以下格式: np.linspace(np.zeros(width)[0], np.full((1,width),-1)[0], height)
np.linspace(np.zeros(5)[0],np.full((1,5),-1)[0],5)
输出以下内容:
array([[ 0. , 0. , 0. , 0. , 0. ],
[-0.25, -0.25, -0.25, -0.25, -0.25],
[-0.5 , -0.5 , -0.5 , -0.5 , -0.5 ],
[-0.75, -0.75, -0.75, -0.75, -0.75],
[-1. , -1. , -1. , -1. , -1. ]])
添加.transpose(),然后你会得到:
array([[ 0. , -0.25, -0.5 , -0.75, -1. ],
[ 0. , -0.25, -0.5 , -0.75, -1. ],
[ 0. , -0.25, -0.5 , -0.75, -1. ],
[ 0. , -0.25, -0.5 , -0.75, -1. ],
[ 0. , -0.25, -0.5 , -0.75, -1. ]])
您可以利用Numpy的广播规则来简单地创建网格。例如,当我想要在从1到24计数的线性数组上执行与np.reshape
(另一个不错的选项)等效的操作时,我会这样做:
row = np.array([1,2,3,4,5,6])
col = np.array([0,6,12,18])
grid = col[:, None] +row[None, :]
结果是:
array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12],
[13, 14, 15, 16, 17, 18],
[19, 20, 21, 22, 23, 24]])
注意,np.newaxis
是None的别名,用于扩展Numpy数组的维度。许多人更喜欢使用np.newaxis而不是None,因为它更易读。
在这里,我使用了sum来组合网格,所以它将是行加上第一列元素,以使结果中的第一行,然后是相同的行加上第二列元素,以使结果中的第二行等等。当内容基于两个像这样的数组时,可以使用其他算术运算符来获得所需的任何网格。
如上所述,以上与reshape
返回的结果完全相同,但广播选项提供了更大的灵活性,适用于其他选项,因此值得注意。
np.reshape(np.arange(1,25),(4,6))
def grid(*args):
return np.stack(np.meshgrid(*args, indexing='ij'), axis=-1)
grid([1,2,3], [4,5,6])
将会给你以下结果:array([[[1, 4],
[1, 5],
[1, 6]],
[[2, 4],
[2, 5],
[2, 6]],
[[3, 4],
[3, 5],
[3, 6]]])
def lingrid(x_start, x_stop, x_steps, y_start, y_stop, y_steps):
a = np.linspace(x_start, x_stop, x_steps)
b = np.linspace(y_start, y_stop, y_steps)
return grid(a, b)
lingrid(0, 1, 3, 0, 2, 3)
给出的结果是:array([[[0. , 0. ],
[0. , 1. ],
[0. , 2. ]],
[[0.5, 0. ],
[0.5, 1. ],
[0.5, 2. ]],
[[1. , 0. ],
[1. , 1. ],
[1. , 2. ]]])
xy = np.matrix([x, y])
。 - Andy Kubiak