1

我正在尝试按照以下示例通过克里金法在 2D 网格上插入响应: 如何在 Python 中使用克里金法插入 2D 空间数据?

但是,当我尝试从 OpenTURNS 中的一维数组创建样本时,

import numpy as np
import openturns as ot
observations = ot.Sample(np.array([1,2,3]))

我不断收到此错误

TypeError: Wrong number or type of arguments for overloaded function 'new_Sample'.
  Possible C/C++ prototypes are:
    OT::Sample::Sample()
    OT::Sample::Sample(OT::UnsignedInteger const,OT::UnsignedInteger const)
    OT::Sample::Sample(OT::UnsignedInteger const,OT::Point const &)
    OT::Sample::Sample(OT::Sample const &,OT::UnsignedInteger const,OT::UnsignedInteger const)
    OT::Sample::Sample(OT::SampleImplementation const &)
    OT::Sample::Sample(OT::Sample const &)
    OT::Sample::Sample(PyObject *)

这也不起作用:

observations = ot.Sample(np.array([[1],[2],[3]]))
4

1 回答 1

0

例外是因为这是一个模棱两可的情况。array包含 3 个值:该类Sample不知道该数据是否对应于由维度 1 中的 3 个点组成的样本,或者对应于具有维度 3 中的一个点的样本。

澄清这一点的类是:

  • 该类ot.Point()管理一个多维实向量 - 它有一个维度(组件的数量),
  • 管理点的ot.Sample()集合 - 它具有大小(样本中的点数)和维度(样本中每个点的维度)。

Python 数据类型和 OpenTURNS 数据类型之间存在自动转换:

  • Pythonlisttuple1D numpyarray会自动转换为ot.Point()
  • 列表的 Pythonlist或 2D numpyarray会自动转换为ot.Sample()

创建一维的常用方法Sample是使用浮点数列表。请让我说明这三个结构。

(案例 1)要从一维数组创建一个点,我们只需将它传递给Point类:

import numpy as np
import openturns as ot

array_1D = np.array([1.0, 2.0, 3.0])
point = ot.Point(array_1D)
print(point)

这将打印[1,2,3],即维度 3 中的一个点。

(案例 2)要从Sample2D 数组创建 a,我们添加所需的方括号。

array_2D = np.array([[1.0], [2.0], [3.0]])
sample = ot.Sample(array_2D)
print(sample)

这打印:

0 : [ 1 ]
1 : [ 2 ]
2 : [ 3 ]

这是一个由 3 个点组成的样本;每个点都有一个维度。

(案例 3)我们经常需要Sample从浮点数列表中创建一个。这可以通过列表理解更容易地完成。

list_of_floats = [1.0, 2.0, 3.0]
sample = ot.Sample([[v] for v in list_of_floats])
print(sample)

这将打印与上一个示例相同的样本。最后一个脚本:

observations = ot.Sample(np.array([[1],[2],[3]]))  
# Oups: should use 1.0 instead of 1

在我的机器上工作正常。请注意,OpenTURNS 只管理浮点值的点,而不是int类型的点。这就是我写的原因:

observations = ot.Sample(np.array([[1.0], [2.0], [3.0]]))  

让这一点足够清楚。然而,对array函数的调用是不必要的。使用起来更简单:

observations = ot.Sample([[1.0], [2.0], [3.0]])  
于 2021-06-04T19:07:36.950 回答