通过 Python 中的 OpenTURNS 将一维数组转换为样本

Posted

技术标签:

【中文标题】通过 Python 中的 OpenTURNS 将一维数组转换为样本【英文标题】:Turn a 1D array into a sample by OpenTURNS in Python 【发布时间】:2021-07-13 15:17:35 【问题描述】:

我正在尝试按照此示例通过克里金法在 2D 网格上插入响应: How to interpolate 2D spatial data with kriging in Python?

但是,当我尝试在 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]]))

【问题讨论】:

【参考方案1】:

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

阐明这一点的类是:

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

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

Python listtuple 或一维 numpy array 会自动转换为 ot.Point() 列表的 Python list 或 2D numpy array 会自动转换为 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)要从二维数组创建 Sample,我们添加所需的方括号。

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]])  

【讨论】:

以上是关于通过 Python 中的 OpenTURNS 将一维数组转换为样本的主要内容,如果未能解决你的问题,请参考以下文章

Pandas: 如何将一列中的文本拆分为多行? | Python

Python将一(多)维数组写入excel中的

Python中的快速数据结构,用于将一堆图像索引为重复项

Python Pandas 将一列中的 NaN 替换为第二列对应行的值

如何将一列中的单词拆分然后在Python中将单词整合在一起,即二维列表到一维列表?

将一列与另一数据框列匹配并粘贴第二个数据中的值 - Python