+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

仅在选择多边形条件下将函数应用于网格?

发布于2021-03-05 09:35     阅读(65)     评论(0)     点赞(16)     收藏(5)


0

1

2

3

4

5

6

7

8

9

我的问题与这篇博文相似,但是我在适应它时遇到了一些麻烦: 使用if语句的网格和用户定义函数的模棱两可的真值

本质上,我希望条件语句看起来不像这样:

import numpy as np

def test(x, y):
    a = 1.0/(1+x*x)
    b = np.ones(y.shape)
    mask = (y!=0)
    b[mask] = np.sin(y[mask])/y[mask]
    return a*b

而是,“掩码”取决于x,y是否位于某个多边形内。因此,结果数组中的每个值都是1,但是会生成4个值之间的多边形。我只希望该函数应用于来自位于多边形内部的2个网格输入(X,Y)的点

x和y是可以为负的实数。

我不确定如何将数组项作为奇异值传递。

我最终想在彩色图上绘制Z谢谢

也就是说,多边形内的点经过变换,多边形外的点仍为1。例如,我希望我的函数看起来像这样

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
def f(x, y, poly):
    a = 1.0/(1+x*x)
    b = np.ones(y.shape)
    mask = (Point(x,y).within(poly) == True)
    b[mask] = a*b
    return b 

x和y是任意尺寸的网格

我应该补充一点,我得到以下错误:“只能将size-1数组转换为Python标量”

生成X和Y并通过调用函数

coords = [(0, 0), (4,0), (4,4), (0,4)]
poly = Polygon(coords)
x = np.linspace(0,10, 11, endpoint = True) # x intervals
y = np.linspace(0,10,11, endpoint = True) # y intervals
X, Y = np.meshgrid(x,y)

Z = f(X, Y, poly)

谢谢!

错误信息:

Traceback (most recent call last):
  File "meshgrid_understanding.py", line 28, in <module>
    Z = f(X, Y, poly)
  File "meshgrid_understanding.py", line 16, in f
    mask = (Point(x,y).within(poly) != True)
  File "C:\Users\Nick\AppData\Local\Programs\Python\Python37\lib\site-packages\shapely\geometry\point.py", line 48, in __init__
    self._set_coords(*args)
  File "C:\Users\Nick\AppData\Local\Programs\Python\Python37\lib\site-packages\shapely\geometry\point.py", line 137, in _set_coords
    self._geom, self._ndim = geos_point_from_py(tuple(args))
  File "C:\Users\Nick\AppData\Local\Programs\Python\Python37\lib\site-packages\shapely\geometry\point.py", line 214, in geos_point_from_py
    dx = c_double(coords[0])
TypeError: only size-1 arrays can be converted to Python scalars

解决方案


Matplotlib具有接受点数组的功能。演示:

import numpy as np
from matplotlib.path import Path

coords = [(0, 0), (4,0), (4,4), (0,4)]

x = np.linspace(0, 10, 11, endpoint=True)
y = np.linspace(0, 10, 11, endpoint=True)
X, Y = np.meshgrid(x, y)

points = np.c_[X.ravel(), Y.ravel()]
mask = Path(coords).contains_points(points).reshape(X.shape)

0

1

2

3

4

5

6

7

8



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/879498/80b7662757fa6213f300/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

16 0
收藏该文
已收藏

评论内容:(最多支持255个字符)