【问题标题】:Only apply changes to table inside unknown boundaries (walls)仅将更改应用于未知边界(墙壁)内的表格
【发布时间】:2019-02-28 10:53:49
【问题描述】:

我希望我的循环仅将“墙”内的表格单元格从 0 更改为 5。 “墙”是用户定义的,可以是任何形状,基于坐标。 该图仅用于可视化。

import matplotlib.pyplot as plt 
import pandas as pd

wallPointsX = [5,5,30,30,55,55,5]
wallPointsY = [5,30,30,55,55,5,5]

df = pd.DataFrame(0, index=range(60), columns=range(60))

for x in range(0, 60):
    for y in range(0, 60):
        df[x][y] = 5 #Should only apply inside "walls"

plt.plot(wallPointsX, wallPointsY)
plt.pcolor(df)
plt.show()

Result plot

【问题讨论】:

  • 你想用一些东西填充所有这些值吗?
  • 是的,循环被简化了,但我想给“墙”内的每个单元格一个值。在这种情况下 5. 墙外的每个单元格都应保持不变,值为 0。
  • 支持您的问题并将其标记为收藏,因为解决它很有趣;)

标签: python python-3.x python-2.7 pandas matplotlib


【解决方案1】:

好的,花了我一些时间,但这样做很有趣。这里的想法是首先从定义墙壁的坐标中创建一个连续的path。接下来,创建一个对象Path。现在循环遍历 DataFrame 中的每个点,然后使用 contains_point 查看创建的 Path 是否包含该 (x,y) 点。我还必须在if 语句中使用条件x==55 and (5<y<=55),以便包含与 最右边的墙。

import matplotlib.path as mplPath
import numpy as np

wallPointsX = [5,5,30,30,55,55,5]
wallPointsY = [5,30,30,55,55,5,5]

# Create a continuous path across the wall coordinates
path = np.array([list(i) for i in zip(wallPointsX, wallPointsY)])
Path = mplPath.Path(path)

df = pd.DataFrame(0, index=range(60), columns=range(60))

for x in range(0, 60):
    for y in range(0, 60):
        if Path.contains_point((x,y)) or (x==55 and (5<y<=55)):
            df[x-1][y-1] = 5 #Should only apply inside "walls"

plt.plot(wallPointsX, wallPointsY)
plt.pcolor(df)

输出

【讨论】:

  • 太棒了,谢谢!但就用户输入(路径)而言,它仍然需要更加动态。例如,试试这个路径:wallPointsX = [5,5,30,30,55,55,30,30,20,20,5] wallPointsY = [5,55,55,30,30,5,5,20 ,20,5,5]
  • 是的,正如您在将上述解决方案应用于新墙壁后所看到的那样,剩下的部分始终位于右侧。显然contains_point 不包括边缘上的点。看here。也许您可以添加一些 if 语句来为您的特定案例所做的事情。
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2021-02-22
  • 2021-11-06
相关资源
最近更新 更多