我想使用matplotlib.collections.LineCollection
对象,从两个Numpy数组x
和y
开始
>>> from matplotlib.collections import LineCollection
>>> from numpy import array, linspace
>>> x = linspace(0, 2, 5)
>>> y = 1-(1-x)**2
实例化LineCollection
的唯一条件是由 segments 列表组成的数据结构,每个 segment 都是的列表> points ,每个 point 是一个元组。
我可以使用两个向量x
和y
>>> segments = np.array(list(zip( zip(x, x[1:]), zip(y, y[1:])))) .transpose((0,2,1))
>>> print(segments)
[[[0. 0. ]
[0.5 0.75]]
[[0.5 0.75]
[1. 1. ]]
[[1. 1. ]
[1.5 0.75]]
[[1.5 0.75]
[2. 0. ]]]
我的问题。可以用一种不太隐秘的方式构造segments
吗?
答案 0 :(得分:2)
我总是喜欢将线段视为3D数组,第一个轴是线段,第二个轴是沿线段的坐标,第三个是每个线段的x和y坐标。
points = np.array([x, y]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-1],points[1:]], axis=1)
或同样地
segments = np.stack((np.c_[x[:-1],x[1:]],np.c_[y[:-1],y[1:]]), axis=2)
答案 1 :(得分:1)
以下是一种可能性:
xy = np.array([x, y])
segments = np.array([[xy[:, i], xy[:, i+1]] for i in range(xy.shape[1]-1)])
尽管我认为它可能不太优雅,因为它具有更多的代码行,使用索引的丑陋迭代且速度稍慢。话虽这么说,但是如果您优先考虑的是一个不太神秘的解决方案,那么这可能对您有用:您避免使用3个zip
函数,一个transpose
,并且我认为总体上更具可读性。