当前位置: 首页 > 面试题库 >

使用scipy.interpole.interpn公司插值N维数组

范瀚昂
2023-03-14
问题内容

假设我的数据依赖于4个变量:a,b,c和d
其中一个数组对应于一个二维插值
b、 以及c和d的值数组。但是,数组大小不必是
一样。具体来说,我的数据来自晶体管模拟。电流
取决于这里的4个变量。我想画一个参数变化。号码
参数上的点数远小于
水平轴。

import numpy as np
from scipy.interpolate import interpn
arr = np.random.random((4,4,4,4))
x1 = np.array([0, 1, 2, 3])
x2 = np.array([0, 10, 20, 30])
x3 = np.array([0, 10, 20, 30])
x4 = np.array([0, .1, .2, .30])
points = (x1, x2, x3, x4)

The following works:

xi = (0.1, 9, np.transpose(np.linspace(0, 30, 4)), np.linspace(0, 0.3, 4))
result = interpn(points, arr, xi)

and so does this:

xi = (0.1, 9, 24, np.linspace(0, 0.3, 4))
result = interpn(points, arr, xi)

but not this:

xi = (0.1, 9, np.transpose(np.linspace(0, 30, 3)), np.linspace(0, 0.3, 4))
result = interpn(points, arr, xi)

正如你所看到的,在最后一个案例中,在席尾的最后两个数组的大小是
与众不同。这种功能是scipy不支持的还是我正在使用的
`不正确?我需要这个创建一个情节,其中的一个’席’是
另一个是水平轴。


问题答案:

我会试着用2D向你解释这件事,这样你就能更好地了解事情的来龙去脉
正在发生。首先,让我们创建一个线性阵列来进行测试。

import numpy as np

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

# Set up grid and array of values
x1 = np.arange(10)
x2 = np.arange(10)
arr = x1 + x2[:, np.newaxis]

# Set up grid for plotting
X, Y = np.meshgrid(x1, x2)

# Plot the values as a surface plot to depict
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, arr, rstride=1, cstride=1, cmap=cm.jet,
                       linewidth=0, alpha=0.8)
fig.colorbar(surf, shrink=0.5, aspect=5)

然后,假设你想沿着一条线插值,也就是说,沿着一个点第一维度,但所有点都沿第二维度。这些要点
显然不在原始数组(x1,x2)中。假设我们想插值到“x1=3.5”点,该点位于x1轴。

from scipy.interpolate import interpn

interp_x = 3.5           # Only one value on the x1-axis
interp_y = np.arange(10) # A range of values on the x2-axis

# Note the following two lines that are used to set up the
# interpolation points as a 10x2 array!
interp_mesh = np.array(np.meshgrid(interp_x, interp_y))
interp_points = np.rollaxis(interp_mesh, 0, 3).reshape((10, 2))

# Perform the interpolation
interp_arr = interpn((x1, x2), arr, interp_points)

# Plot the result
ax.scatter(interp_x * np.ones(interp_y.shape), interp_y, interp_arr, s=20,
           c='k', depthshade=False)
plt.xlabel('x1')
plt.ylabel('x2')

plt.show()

这会得到所需的结果:请注意,黑点的位置正确
在平面上,x1值为3.5。!【插值曲面图】
[分数](https://i.stack.imgur.com/AKDzK.png)
请注意,大多数的“魔力”,以及你的问题的答案,在于这些
两条线:

interp_mesh = np.array(np.meshgrid(interp_x, interp_y))
interp_points = np.rollaxis(interp_mesh, 0, 3).reshape((10, 2))

我已经解释了它的工作原理
其他地方. 总之,这是什么
做的是创建一个大小为10x2的数组,包含10的坐标
要在“arr”处插入的点。(唯一的区别是
我为这篇文章写了一个解释np.mgrid公司,其中
是写作的捷径np.网格为了一群阿兰奇)
对于您的4x4案例,您可能需要以下内容:

interp_mesh = np.meshgrid([0.1], [9], np.linspace(0, 30, 3),
                          np.linspace(0, 0.3, 4))
interp_points = np.rollaxis(interp_mesh, 0, 5)
interp_points = interp_points.reshape((interp_mesh.size // 4, 4))
result = interpn(points, arr, interp_points)

Hope that helps!



 类似资料:
  • 问题内容: 我需要有一个n维字段,其中n基于构造函数的输入。但是我什至不确定这是否可行。是吗? 问题答案: 快速的解决方案:你可以用非通用近似它的的…要深,因为你需要。但是,使用快速可能会很尴尬。 另一种需要更多工作的选择可能是使用基础平面数组表示形式来实现您自己的类型,在其中您内部计算索引,并为访问器方法提供vararg参数。我不确定它是否完全可行,但可能值得一试… 粗略的示例(未经测试,没有溢

  • 本文向大家介绍比较公司和公司。,包括了比较公司和公司。的使用技巧和注意事项,需要的朋友参考一下 公司与公司之间的主要区别如下- 公司 成立公司 这是经营业务的实体。 注册为公司的第一步。 它被称为CORP。 它被称为INC。 第二阶段的业务。 进行公司注册手续。 持有个人资产负债。 有限责任。 成立过程的结果。 应遵循法律程序。 不要为公司筹集资金。 充当集资渠道。 与日常业务活动有关。 维护所有

  • 问题内容: 我有一个2D Numpy数组,包含从0到n的值。我想要一个长度为n的列表,以使该列表的第i个元素是值i + 1(不包括0)的所有索引的数组。 例如,对于输入 我期望得到 我发现了一个相关的问题: 在numpy数组中获取重复元素的所有索引的列表, 这可能会有所帮助,但我希望找到一个更直接的解决方案,该方法不需要展平和排序数组,并且尽可能高效。 问题答案: 这是一种矢量化方法,适用于任意数

  • 我不熟悉node。js被困在这里了。我有一个json文件keyValue。类似于此的json 对于特定的键,我需要获取值。 如何在node中实现这一点。js。谢谢你的帮助。

  • 我正在尝试从我的本地主机(在 Windows 上)测试我们的曼德里尔 API。似乎我需要配置“本地颁发者证书”。因此,我下载了 http://curl.haxx.se/ca/cacert.pem 并将其保存在我的文档根目录(c:\wamp\www)中。然后,在我的 php.ini 文件中,我配置了这个: 。 当我运行 Mandrill 的示例代码时,我收到以下错误: 出现mandrill错误:Ma

  • 我无法从我的django站点连接到我的postgres数据库。在开始之前,我已经阅读并尝试了以下每个站点提供的说明: 詹戈设置:通灵镜2。操作错误: FATAL: 对等身份验证失败的用户 “独立” 操作错误: (心理医生 2.操作错误) FATAL: 用户的密码身份验证失败 致命:用户“根”后gresql的密码身份验证失败 postgresql: FATAL: 用户“道格拉斯”的密码身份验证失败