numpy中是否有多维版本的arange / linspace?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy中是否有多维版本的arange / linspace?相关的知识,希望对你有一定的参考价值。
我想要一个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.5
)替换为a complex number,其大小指定了系列中所需的点数。使用此语法,将上述相同的数组指定为:
X, Y = np.mgrid[-5:5:21j, -5:5:21j]
然后,您可以创建对:
xy = np.vstack((X.flatten(), Y.flatten())).T
正如@ali_m建议的那样,这一切都可以在一行中完成:
xy = np.mgrid[-5:5.1:0.5, -5:5.1:0.5].reshape(2,-1).T
祝你好运!
我想你想要np.meshgrid
:
从坐标向量返回坐标矩阵。
在给定一维坐标数组x1,x2,...,xn的情况下,为N-D网格上的N-D标量/矢量场的矢量化评估制作N-D坐标数组。
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. ]])
我们可以使用安排功能:
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]]
如果你只想迭代对(而不是一次对整个点集进行计算),itertools.product
可能最好服务于迭代所有可能的对:
import itertools
for (xi, yi) in itertools.product(x, y):
print(xi, yi)
这避免了通过meshgrid
生成大型矩阵。
这正是您正在寻找的:
matr = np.linspace((1,2),(10,20),10)
这意味着:
对于第一列;从(1,2)中的1个到10个中的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.]]
不确定我是否理解这个问题 - 制作一个2元素NumPy数组的列表,这有效:
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
给你一个元组列表,其余的列表理解。
根据这个例子,你可以做任何你想要的暗淡
def linspace3D(point1,point2,length):
v1 = np.linspace(point1[0],point2[0],length)
v2 = np.linspace(point1[1],point2[1],length)
v3 = np.linspace(point1[2],point2[2],length)
line = np.zeros(shape=[length,3])
line[:,0]=v1
line[:,1]=v2
line[:,2]=v3
return line
以上是关于numpy中是否有多维版本的arange / linspace?的主要内容,如果未能解决你的问题,请参考以下文章
Numpy深入剖析Numpy.arange()与range()的区别