【问题标题】:Get data array from object in Python从Python中的对象获取数据数组
【发布时间】:2017-08-05 03:42:31
【问题描述】:

我正在使用library,它在给定对象k 的情况下生成3 个图。

我需要计算产生这些图的数据点 (x,y,z),但问题是这些图来自 k 的函数。

我使用的库是pyKrigingthis 是他们的 github 存储库。

他们的示例code 的简化版本是:

import pyKriging  
from pyKriging.krige import kriging  
from pyKriging.samplingplan import samplingplan

sp = samplingplan(2)  
X = sp.optimallhc(20)

testfun = pyKriging.testfunctions().branin  
y = testfun(X)

k = kriging(X, y, testfunction=testfun, name='simple')   
k.train()
k.plot()

完整的代码、cmets和输出可以在here找到。

总之,我正在尝试获取生成这些图的numpy 数组,以便我可以创建符合我的格式样式的图。

我不了解如何使用 Python 编写库代码,感谢任何帮助!

【问题讨论】:

  • 你的格式样式是什么?您可以先设置它们,然后调用k.plot()
  • 您希望我们搜索kringing 文档和/或代码来找到这个吗?答案在于他们的代码。这不是一般的numpy 问题。在pandas 中,您使用.values 方法从数据帧中提取数组。
  • 您可能想直接在githubpyKriging 网站上提出这个问题。这是一个复杂的代码,正如@hpaulj 指出的那样,没有人会仔细阅读代码并为您提供答案。
  • 这是一个关于使用开源工具进行编程的有效问题,因此只要在问题中提供了有关哪种绘图样式的足够信息,就可以回答它。由于克里金法在其代码中使用了 numpy 数组和方法,因此 numpy 标记是有效的。所以,再次@yellow01,您应该提供有关您想要样式的详细信息。
  • 感谢所有 cmets。起初,我想知道我是否可以以某种方式访问​​生成图的numpy 数组,而无需通过库。正如@hpaulj 所说,类似于pandas 中的.values。 @ImportanceOfBeingErnest 样式只是没有轮廓填充的第一个和第二个图(contour() 而不是contourf())。您是否认为实现这一目标的唯一方法是调整原始库,或者我可以在我的代码中放置一个新行?

标签: python numpy matplotlib kriging


【解决方案1】:

没有生成该图的单个数据数组。相反,许多用于绘图的数组是在克里金绘图函数中生成的。
将填充轮廓更改为线条轮廓当然不是样式选项。因此需要使用原始绘图功能中的代码。

一个选项是继承kriging 并实现一个自定义绘图函数(我们称之为myplot)。在此函数中,可以使用contour 代替contourf。当然,也可以完全根据自己的需要进行更改。

import pyKriging  
from pyKriging.krige import kriging  
from pyKriging.samplingplan import samplingplan
import numpy as np
import matplotlib.pyplot as plt

class MyKriging(kriging):
    def __init__(self,*args,**kwargs):
        kriging.__init__(self,*args,**kwargs)
    def myplot(self,labels=False, show=True, **kwargs):
        fig = plt.figure(figsize=(8,6))
        # Create a set of data to plot
        plotgrid = 61
        x = np.linspace(self.normRange[0][0], self.normRange[0][1], num=plotgrid)
        y = np.linspace(self.normRange[1][0], self.normRange[1][1], num=plotgrid)
        X, Y = np.meshgrid(x, y)
        # Predict based on the optimized results
        zs = np.array([self.predict([xi,yi]) for xi,yi in zip(np.ravel(X), np.ravel(Y))])
        Z = zs.reshape(X.shape)
        #Calculate errors
        zse = np.array([self.predict_var([xi,yi]) for xi,yi in zip(np.ravel(X), np.ravel(Y))])
        Ze = zse.reshape(X.shape)

        spx = (self.X[:,0] * (self.normRange[0][1] - self.normRange[0][0])) + self.normRange[0][0]
        spy = (self.X[:,1] * (self.normRange[1][1] - self.normRange[1][0])) + self.normRange[1][0]

        contour_levels = kwargs.get("levels", 25)
        ax = fig.add_subplot(222)
        CS = plt.contour(X,Y,Ze, contour_levels)
        plt.colorbar()
        plt.plot(spx, spy,'or')

        ax = fig.add_subplot(221)
        if self.testfunction:
            # Setup the truth function
            zt = self.testfunction( np.array(zip(np.ravel(X), np.ravel(Y))) )
            ZT = zt.reshape(X.shape)
            CS = plt.contour(X,Y,ZT,contour_levels ,colors='k',zorder=2, alpha=0)

        if self.testfunction:
            contour_levels = CS.levels
            delta = np.abs(contour_levels[0]-contour_levels[1])
            contour_levels = np.insert(contour_levels, 0, contour_levels[0]-delta)
            contour_levels = np.append(contour_levels, contour_levels[-1]+delta)

        CS = plt.contour(X,Y,Z,contour_levels,zorder=1)
        plt.plot(spx, spy,'or', zorder=3)
        plt.colorbar()

        ax = fig.add_subplot(212, projection='3d')
        ax.plot_surface(X, Y, Z, rstride=3, cstride=3, alpha=0.4)
        if self.testfunction:
            ax.plot_wireframe(X, Y, ZT, rstride=3, cstride=3)
        if show:
            plt.show()



sp = samplingplan(2)  
X = sp.optimallhc(20)

testfun = pyKriging.testfunctions().branin  
y = testfun(X)

k = MyKriging(X, y, testfunction=testfun, name='simple')   
k.train()
k.myplot()

【讨论】:

  • 这当然是@ImportanceOfBeingErnest 问题的答案。为了获得产生这些图的数据数组,我添加了return X,Y,Z。现在,假设我只想要这些数据数组 (X,Y,Z) 以供进一步使用,我不介意绘制它。是否有另一种方法使用子类来仅return XYZ 等数组?如果是这样,这肯定是对这个问题和标题的更一般的答案。谢谢!
  • 用于绘图的数组是XYZZTZe。它们是在绘图方法中生成的。如果您只需要那些,您可以从自定义绘图函数中删除与绘图相关的所有内容并仅返回这些数组。
猜你喜欢
  • 2017-10-06
  • 2018-01-24
  • 2021-09-14
  • 2014-05-04
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
相关资源
最近更新 更多