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   

たとえば、このように 2 つのベクトル (xp、yp) を作成します (Excel で) 800 行

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

3 番目の列では、0 から 800 までの乱数 (昇順でランク付け) を使用して、別のベクトル (60 行) を作成します。これにより、次のような結果が得られます。

Third Column    
17.2    
52.6    
75.8    
[...]

3 列目を 1 列目に補間したいと思います。そう

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 に答える