- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个域的角度数据,该数据以 pi
弧度(即 0 = pi
)包裹。数据是 2D
,其中一维表示角度。我需要以包装方式将这些数据插入到另一个网格中。
在一个维度上,np.interp
函数采用句点 kwarg
(对于 NumPy
1.10 及更高版本): http://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html
这正是我所需要的,但我需要它是二维的。我目前只是逐步浏览数组中的列并使用 np.interp
,但这当然很慢。
有什么可以达到相同结果但速度更快的吗?
最佳答案
np.interp
作品使用 source ,卢克!
numpy doc for np.interp
使来源特别容易找到,因为它有链接和文档。让我们逐行分析一下。
首先记忆一下参数:
"""
x : array_like
The x-coordinates of the interpolated values.
xp : 1-D sequence of floats
The x-coordinates of the data points, must be increasing if argument
`period` is not specified. Otherwise, `xp` is internally sorted after
normalizing the periodic boundaries with ``xp = xp % period``.
fp : 1-D sequence of floats
The y-coordinates of the data points, same length as `xp`.
period : None or float, optional
A period for the x-coordinates. This parameter allows the proper
interpolation of angular x-coordinates. Parameters `left` and `right`
are ignored if `period` is specified.
"""
让我们举一个简单的三角波例子:
xp = np.array([-np.pi/2, -np.pi/4, 0, np.pi/4])
fp = np.array([0, -1, 0, 1])
x = np.array([-np.pi/8, -5*np.pi/8]) # Peskiest points possible }:)
period = np.pi
现在,我从 period != None
开始在所有类型检查发生之后,源代码中的分支:
# normalizing periodic boundaries
x = x % period
xp = xp % period
这只是确保 x
的所有值和 xp
供应介于 0
之间和 period
.所以,由于期间是 pi
, 但我们指定了 x
和 xp
介于 -pi/2
之间和 pi/2
, 这将通过添加 pi
进行调整[-pi/2, 0)
范围内的所有值,以便它们有效地出现在 pi/2
之后.所以我们的xp
现在显示 [pi/2, 3*pi/4, 0, pi/4]
.
asort_xp = np.argsort(xp)
xp = xp[asort_xp]
fp = fp[asort_xp]
这只是订购 xp
按递增顺序。在上一步中执行该模运算之后,尤其需要这样做。所以,现在xp
是[0, pi/4, pi/2, 3*pi/4]
. fp
也相应地进行了改组,[0, 1, 0, -1]
.
xp = np.concatenate((xp[-1:]-period, xp, xp[0:1]+period))
fp = np.concatenate((fp[-1:], fp, fp[0:1]))
return compiled_interp(x, xp, fp, left, right) # Paraphrasing a little
np.interp
做线性插值。尝试在两点之间进行插值时 a
和 b
出现在 xp
, 它只使用 f(a)
的值和 f(b)
(即 fp
在相应索引处的值)。那又怎样np.interp
这最后一步做的就是取点xp[-1]
并放在数组前面,取点xp[0]
并将其放在数组之后,但分别减去和添加一个句点。所以你现在有一个新的 xp
看起来像 [-pi/4, 0, pi/4, pi/2, 3*pi/4, pi]
.同样,fp[0]
和 fp[-1]
已经串联在一起,所以 fp
现在是[-1, 0, 1, 0, -1, 0]
.
请注意,在模运算之后,x
已被带入[0, pi]
范围太大,所以x
现在是[7*pi/8, 3*pi/8]
.这让你很容易看到你会回来 [-0.5, 0.5]
.
假设您有一个网格和一些值。让我们将所有值都放在 [0, pi]
之间即时可用,因此我们无需担心模数和改组问题。
xp = np.array([0, np.pi/4, np.pi/2, 3*np.pi/4])
yp = np.array([0, 1, 2, 3])
period = np.pi
# Put x on the 1st dim and y on the 2nd dim; f is linear in y
fp = np.array([0, 1, 0, -1])[:, np.newaxis] + yp[np.newaxis, :]
# >>> fp
# array([[ 0, 1, 2, 3],
# [ 1, 2, 3, 4],
# [ 0, 1, 2, 3],
# [-1, 0, 1, 2]])
我们现在知道您需要做的就是添加 xp[[-1]]
在数组和 xp[[0]]
的前面最后,针对期间进行调整。请注意我是如何使用单例列表进行索引的 [-1]
和 [0]
.这是 trick确保dimensions are preserved .
xp = np.concatenate((xp[[-1]]-period, xp, xp[[0]]+period))
fp = np.concatenate((fp[[-1], :], fp, fp[[0], :]))
终于可以免费使用了 scipy.interpolate.interpn
达到你的结果。让我们获取 x = pi/8
处的值对于所有 y
:
from scipy.interpolate import interpn
interp_points = np.hstack(( (np.pi/8 * np.ones(4))[:, np.newaxis], yp[:, np.newaxis] ))
result = interpn((xp, yp), fp, interp_points)
# >>> result
# array([ 0.5, 1.5, 2.5, 3.5])
interp_points
必须指定为 Nx2 点矩阵,其中第一个维度是您想要在第二个维度上插值的每个点,给出该点的 x 和 y 坐标。参见 this answer以获得详细的解释。
如果你想得到[0, period]
范围之外的值,你需要自己取模:
x = 21 * np.pi / 8
x_equiv = x % period # Now within [0, period]
interp_points = np.hstack(( (x_equiv * np.ones(4))[:, np.newaxis], yp[:, np.newaxis] ))
result = interpn((xp, yp), fp, interp_points)
# >>> result
# array([-0.5, 0.5, 1.5, 2.5])
同样,如果你想生成interp_points
对于一堆 x 和 y 值,请查看 this answer .
关于python - Python 中的环绕(圆形)2D 插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39380251/
我正在学习 ada 并且我正在尝试为枚举实现附加重载。 基本上我希望能够向 Day 类型添加一个 Integer 并获得生成的 Day 值。所以星期一 + 2 => 星期三。 这是我的简化代码: pr
Pycharm 具有“包围”代码片段的功能。有一些已经设置好的功能: 我想添加print()(使用python3),我该怎么做? 最佳答案 AFAIU,您可以为此定义自己的“实时”模板。 定义实时模板
例。我有一个包含15个对象的数组。我想从给定的索引开始枚举。假设从索引5开始,然后是上方的索引,下方,上方,下方等的索引...我确实希望它绕起来。 因此,在我的示例中,索引的顺序将是这样。 5、6、4
我需要帮助创建 UIPickerView 来环绕选项。因此,选择器不是这样的: 我希望它看起来像这样(没有“min”): 我到处找,但找不到用 Swift 2.0 实现的方法谢谢! 最佳答案 以下是有
如何让 UITextView 将其文本包裹在 UIImage 周围,如下图所示? 图像大小不一定是事先已知的。 最佳答案 IOS 7 及以上版本: UIBezierPath * imgRect = [
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: UIScrollView. Any thoughts on implementing “infinite” scro
我像这样创建纹理: this->width = width; this->height = height; glGenFramebuffers(1, &framebuffer); glBindFram
在编码和模板化中,我经常需要换行文本的特定部分。是否有任何快捷方式可以包装当前选择,例如: Hello World "Hello World" Hello World {{ trans 'Hello
我正在做一个项目,我们有一些从数据库中填充的 Highcharts 图表;其中之一是散点图,我们需要包围放置在图表外部区域的点。 我们需要像 this 这样的图表但是我们需要散点图外部点周围的区域;使
我有一个 500 像素高和 50 像素宽的 jpg。它由 10 个 50px x 50px 的正方形组成,每个正方形包含一个从 1 到 10 的数字(1 在图像顶部,10 在底部)。 (jpg 在这里
我正在尝试为那些了解它的人创建一个类似 Microsoft Project 的元素控件。 我有一个Container Div,然后有两个子容器如下: 每个子容器都有很多内部 div,例如,我的第一个子
我有 4 个 div,一个我想向左浮动,视频播放器(加载了 jquery),另一个包含一些将向右浮动的帮助/提示文本。这两个应该排在顶部。在视频播放器下方将是一个 div 内的表格。 当有人点击表格中
这个问题在这里已经有了答案: Proper use of flex properties when nesting flex containers (1 个回答) 关闭 4 年前。
我在使用自定义列表图像时遇到问题/其中图标隐藏在列表环绕的 float 元素后面。 http://jsfiddle.net/V8evM/ HTML This is list item n
是否可以将 textview 环绕在 textview 周围,第二个 textview 将环绕到第一个 textview 下的下一行? 例如: 我尝试过使用 android:layout_weig
图片最能说明问题: 它只是一个 float: left 图像 ( http://jsbin.com/itihes/1 )。有什么方法可以防止纯 CSS 中的动态文本出现这个问题吗?我确实希望文本换行,
我在 C 规范中读到一点,无符号变量(特别是 unsigned short int)在整数溢出时执行一些所谓的环绕 ,尽管我在带符号的变量上找不到任何东西,除了我留下了未定义的行为。 我的教授告诉我,
如果您想要容器底部的 div,如何让文本环绕 div? 我可以弄清楚如何让文本环绕在 div 上,只要它在顶部,但如果我尝试将它推到页面底部,文本要么不会'不要继续跨越 div 的顶部,否则 div
假设数组的长度为 1000。我正在尝试创建一种简单的方法来遍历存储在数组中的图像路径而不会越界。当涉及到单击“下一步”按钮以增加数组索引时,下面的方法使用模数很好地处理了环绕,但当我必须减少并从索引中
假设我的光标在单词 word 内.使用 vim-surround,输入序列 ysiw*将替换 word与 *word* . 问题:是否有我可以输入的单个序列来代替生成 **word** (即,单词加粗
我是一名优秀的程序员,十分优秀!