0

我尝试尝试 Xlwings 的一些功能。我想使用 numpy 中的一个通用函数,它允许快速插值(numpy.interp)。

@xlfunc
def interp(x, xp,yp):
    """Interpolate vector x on vector (xp,yp)"""
    y=np.interp(x,xp,yp)
    return y

@xlfunc
def random():
    """Returns a random number between 0 and 1"""
    x=np.random.randn()
    return x   

例如,我创建两个向量 (xp, yp) 像这样(在 Excel 中)800 行

First Column Second Column
0    =random()
1    =random()
2    =random()
3    =random()
4    =random()
5    =random()
[...]

在第三列中,我创建了另一个向量(60 行),随机数介于 0 和 800 之间(按升序排列),这给了我这样的信息:

Third Column    
17.2    
52.6    
75.8    
[...]

我想将第三列插入第一列。所以

Fourth Column    
=interp(C1,A1:A800,B1:B800)    
=interp(C2,A1:A800,B1:B800)    
=interp(C3,A1:A800,B1:B800)    
[...]

这很容易做到。但是,如果我有 10 列或更多列要插值,则可能需要太多时间。我确信有更好的方法来做到这一点。一个主意 ?

谢谢你的帮助 !

编辑 :

我试过了,但在“xw.Range[...].value=y”处不起作用

@xw.xlfunc
def interpbis(x, xp,yp):
    """Interpolate scalar x on vector (xp,yp)"""
    thisWB=xw.Workbook.active()
    thisSlctn=thisWB.get_selection(asarray=True)
    sheet=thisSlctn.xl_sheet.name
    r = thisSlctn.row
    c = thisSlctn.column
    y=np.interp(x,xp,yp)
    xw.Range(sheet,(r,c)).value=y
    return None
4

1 回答 1

1

简短的回答是:使用 Excel 的数组函数。

长答案是:首先,更新到 xlwings v0.6.4(否则我要展示的random()内容将不起作用)。然后按如下方式更改您的功能:

from xlwings import Application, Workbook, xlfunc
import numpy as np

@xlfunc
def interp(x, xp, yp):
    """Interpolate vector x on vector (xp,yp)"""
    y = np.interp(x, xp, yp)
    return y[:, np.newaxis]  # column orientation

@xlfunc
def random():
    """Returns a random number between 0 and 1"""
    app = Application(Workbook.caller())
    # We shall make this easier in a future release (getting the array dimensions)
    r = app.xl_app.Caller.Rows.Count
    c = app.xl_app.Caller.Columns.Count
    x = np.random.randn(r, c)
    return x

现在在 Excel 中使用此处描述的数组公式( Ctrl+Shift+Enter)。

于 2016-01-06T10:56:26.467 回答