首页 > 解决方案 > 当我只需要 1 个时,循环打印 2 个内部列表的长度

问题描述

我有一个 xy 坐标列表,如下所示: [[xcoords][ycoords]] 因为我的 For 循环使用整个列表的长度,它会打印 90 个奇怪的结果,而实际上我只需要一半。

当我尝试访问前半部分的长度时,出现此错误: 索引 2 超出轴 0 的范围,大小为 2

import numpy as np
import matplotlib.pyplot as plt
import shapely.geometry
from shapely.geometry import LineString
from shapely.geometry import Point, Polygon
import descartes    

quality = 7
x = np.linspace(-1,1,quality)
y = np.linspace(-1,1,quality)
X,Y = np.meshgrid(x,y)
polycoords = [[-1, 1], [-1, 0.5], [0, 0.5], [0, 1]]
clip_poly = shapely.geometry.Polygon(polycoords)


positions = np.vstack([Y.ravel(), X.ravel()])

fig = plt.figure()
ax = fig.add_subplot(111)
polygonbuilding = ax.add_patch(descartes.PolygonPatch(clip_poly, fc='pink', alpha=0.3))

origin = [0,0]


for i in range(len(positions)):
    for j in range(len(positions[i])):
        plt.scatter(*positions[::-1])
        x1 = positions[0][j]
        y1 = positions[1][j]
        line = LineString([origin, (x1, y1)])
        ax.plot(*np.array(line).T, color='none', linewidth=1, solid_capstyle='round')
        if line.intersects(clip_poly) == True:
            ax.plot(*np.array(line).T, color='red', linewidth=1, solid_capstyle='round')
        else:
            ax.plot(*np.array(line).T, color='green', linewidth=1, solid_capstyle='round')
        print (origin, [x1,y1],line.intersects(clip_poly)/2)
        
plt.show()

我得到什么 VS 我需要什么(红色)

我得到什么 VS 我需要什么(红色)

标签: pythonfor-loop

解决方案


这是因为您的 [positions] 变量中有一个 dup,请尝试打印它:

import numpy as np
import matplotlib.pyplot as plt
import shapely.geometry
from shapely.geometry import LineString
from shapely.geometry import Point, Polygon
import descartes    

quality = 7
x = np.linspace(-1,1,quality)
y = np.linspace(-1,1,quality)
X,Y = np.meshgrid(x,y)
polycoords = [[-1, 1], [-1, 0.5], [0, 0.5], [0, 1]]
clip_poly = shapely.geometry.Polygon(polycoords)


positions = np.vstack([Y.ravel(), X.ravel()])
print(positions)

[[-1.         -1.         -1.         -1.         -1.         -1.
  -1.         -0.66666667 -0.66666667 -0.66666667 -0.66666667 -0.66666667
  -0.66666667 -0.66666667 -0.33333333 -0.33333333 -0.33333333 -0.33333333
  -0.33333333 -0.33333333 -0.33333333  0.          0.          0.
   0.          0.          0.          0.          0.33333333  0.33333333
   0.33333333  0.33333333  0.33333333  0.33333333  0.33333333  0.66666667
   0.66666667  0.66666667  0.66666667  0.66666667  0.66666667  0.66666667
   1.          1.          1.          1.          1.          1.
   1.        ]
 [-1.         -0.66666667 -0.33333333  0.          0.33333333  0.66666667
   1.         -1.         -0.66666667 -0.33333333  0.          0.33333333
   0.66666667  1.         -1.         -0.66666667 -0.33333333  0.
   0.33333333  0.66666667  1.         -1.         -0.66666667 -0.33333333
   0.          0.33333333  0.66666667  1.         -1.         -0.66666667
  -0.33333333  0.          0.33333333  0.66666667  1.         -1.
  -0.66666667 -0.33333333  0.          0.33333333  0.66666667  1.
  -1.         -0.66666667 -0.33333333  0.          0.33333333  0.66666667
   1.        ]]

推荐阅读