Excel

差し込み印刷の桁設定

Alt+F9でフィールドコード編集画面に入り,{MARGEFIELD "FIELDNAME" \# 0.00}のようにする.

GhostScript

複数のPSファイルをPDFに連結

gswin32c -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE#pdfwrite -sOutputFile=merged.pdf
  -dCompatibilityLevel#1.2 -f PSファイルを列挙

ImageMagick

GIFアニメを分解する

convert +adjoin gif-animation.gif output.gif

GIFアニメを合成する

convert -loop 0 -delay 5 -resize 200x200 anim*.gif gif-animation.gif

Mathematica

Notebookが置かれているディレクトリのdata.txtからReadListする

data=ReadList[DirectoryName[NotebookFilePath[Notebooks[][[1]]]]<>"data.txt",
              Number,RecordLists->True];

Matlab

bar()で描いた棒グラフにerrorbar()を重ねる

Mathworks Japanのテクニカルソリューション を参考に。 bar()のスタイルに'hist'を指定しているのがポイント。こんな面倒なことしなくても描けるようになっていればいいのに。 → barErrorbar という関数を作りました。超いいかげんですが。

Y = [456.1667,334.4615; 349.1667,239.1538; 27.5833, 20.4615]; %平均
e = [195.7527,165.6491; 140.0213,138.5170; 19.8981,14.6976]; %標準偏差

figure, h = bar(Y,0.8,'hist'); % ハンドルを取得
hold on

[numgroups, numbars] = size(Y); % numgroups: グループ数, numbars: 標本数

% 各棒グラフのX座標値を取得
xdata = get(h,'XData'); % 出力はセル配列
% X座標から各棒グラフの中心座標を計算
centerX = cellfun(@(x)(x(1,:)+x(3,:))/2,xdata,'UniformOutput', false);

% 標準偏差を棒グラフに重ねて描画
for i = 1:numbars
errorbar(centerX{i,:}, Y(:,i), e(:,i), 'k',...
'linestyle', 'none','LineWidth',2);
end

グラフのオプションがわからん

get(gca)すると手っ取り早い。

Python/VE

マルチディスプレイにおけるpygameの疑似フルスクリーン

要するにフレームレスのウィンドウを開いてスクリーンの幅と位置を指定しているだけ。win32guiを使うにはpywin32をインストールすればよい。

import win32gui
import pygame
import VisionEgg

VisionEgg.config.VISIONEGG_GUI_INIT = 0
VisionEgg.config.VISIONEGG_SCREEN_W = 2560
VisionEgg.config.VISIONEGG_SCREEN_H = 1024
VisionEgg.config.VISIONEGG_FRAMELESS_WINDOW = 1
VisionEgg.config.VISIONEGG_FULLSCREEN = 0

wm_info = pygame.display.get_wm_info()
handle = wm_info['window']
win32gui.MoveWindow(handle,0,0,2560,1024,1) #1280x1024のディスプレイ2台の場合

matplotlibで日本語のテキストを表示する(Windows)

matplotlib.font_manager.FontPropertiesを使ってフォントファイルを指定すればよい。

# -*- coding: shift-jis -*-
import pylab
import matplotlib.font_manager
fontprop = matplotlib.font_manager.FontProperties(fname=
                                   r'c:\windows\fonts\msgothic.ttc')
x = pylab.arange(0,11)
pylab.plot(x,x**2,'bx-')
pylab.text(5,50,u'日本語のテキスト',fontproperties=fontprop,
           horizontalalignment='center',fontsize=48)
pylab.waitforbuttonpress()

numpy.histogramで相対累積度数を得る

pylab.histなら以下のようにすると相対累積度数のグラフが描ける。

In [1]: pylab.hist(data,normed=True,cumulative=True)

このままpylab.histをnumpy.histogramで置き換えるとcumulativeなんて知らないと怒られる。 仕方がないのでこのようにする。

In [2]: (n,b) = numpy.histogram(data,normed=True)
In [3]: relcumhist = numpy.cumsum(n*numpy.diff(b))

numpyで行列中のNaNではない値のインデックスを得る

matlabなら行列AにおいてNaNではない値のインデックスを得るには

>> A = [1,NaN,3; 4, 5, NaN]

A =

     1   NaN     3
     4     5   NaN

>> ~isnan(A)

ans =

     1     0     1
     1     1     0

とすればよいが、numpy.isnanで not isnan(A)としても怒られる。仕方ないので直観的ではないが 「pythonではNaNとNaNの比較は偽になる」 という謎の性質を活かして以下のようにする。

In [1]: A = array([[1, NaN, 3],[4, 5, NaN]])

In [2]: A
Out[2]:
array([[  1.,  NaN,   3.],
       [  4.,   5.,  NaN]])

In [3]: A==A
Out[3]:
array([[ True, False,  True],
       [ True,  True, False]], dtype=bool)

追記: notがvectorizeされていないことがこのTIPSの根本だが、一般的な関数であればnumpy.vectorizeで簡単にvectorizeできる。

>>> int(numpy.array([54.4,651.1,114.2,519.8]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: only length-1 arrays can be converted to Python scalars
# エラーになる

>>> numpy.vectorize(int)(numpy.array([54.4,651.1,114.2,519.8]))
array([ 54, 651, 114, 519])
# エラーにならない

さらに追記: 上のintを適用する例だが、戻り値がnumpy.ndarrayじゃなくて普通のリストでいいならmapを使えばいい。

>>> map(int,numpy.array([54.4,651.1,114.2,519.8]))
[54, 651, 114, 519]

numpy.ndarrayでベクトルをreverseする

numpy.ndarrayにはreverse()メソッドがないのでぱぱっと以下のようにする。

>>> v = v[-1::-1]

numpy.ndarrayでMatlabのようにsortrowsする

調べ方が甘いのかもしれないが、numpy.ndarrayではmatlabのsortrowsのように複数の列でソートするメソッドがない。 numpyのstructured arrayだとorderという引数で指定できるのだが、structured arrayはどうもなじめないのでsortrowsっぽい関数を書いてみた。 pythonでは0から列を数え始める関係でmatlabのように負の数で降順のソートを指定することができないので、昇順=True、降順=Falseと値を並べたリストを引数orderに指定する(省略するとすべて昇順になる)。

def sortrows(d,cols,order=None):
    if order == None:
        order = [True for i in range(len(cols))]
    ndx = numpy.arange(len(d))
    for i in range(len(cols)-1,-1,-1):
        if order[i]:
            idx = d[ndx,cols[i]].argsort(kind='mergesort')
        else:
            idx = (-d[ndx,cols[i]]).argsort(kind='mergesort')
        ndx = ndx[idx]
    return ndx

matplotlibで描いたグラフを次々とPDFに出力する

タイトル通り。複数のグラフを印刷するとき、ひとつのPDFにまとめられると印刷がとても楽。1ページに複数のグラフを入れたいときはsubplot()を使えばよい。 残念ながらこれだけだと日本語フォントのテキストが出力されない。要調査。

import pylab
from matplotlib.backends.backend_pdf import PdfPages
pp = PdfPages('plotStimulusSample.pdf') #出力するPDFファイルを開く

for n in range(numfigures):

    #中略
    pylab.plot(x,y) #plotする。
    pp.savefig() #現在のfigureをPDFに新しいページとして追加

matplotlibのグラフに矢印を描画する(arrow編)

これまたタイトル通り。矢印を描画するにはarrow()を使う方法とArrow()を使う方法があるようで、後者の方がいろいろ ステキ な矢印が描けそうな感じだったが、たまたま調べた時の用途では前者の方がプログラムの書き換えが少なく済みそうだったのでarrow()を使ってみた。いずれArrow()も使ってみないとな。

import pylab

x = [0.89064446,0.834436303,0.121934399,0.646634762,0.337997301,
     0.848654182,0.804363558,0.89894703,0.523656518,0.246692905,
     0.553279183,0.045518353,0.449363633,0.960618344,0.169243703,
     0.741644275,0.473015254,0.358869952,0.85139137,0.408838397]

y = [1.15070506,0.909035943,0.208278625,0.935162453,0.623456887,
     1.145361537,1.141312616,1.198474162,0.763420585,0.607533692,
     0.628054628,0.278930296,0.889435016,1.161674753,0.545490566,
     1.095609966,0.478271075,0.637937138,1.305667185,0.694374359]

pylab.plot(x, y,'ko', markersize = 5, hold=False)
for i in [1,3,5]:
    pylab.arrow(x[i]+0.08,y[i]-0.08,-0.04,0.04,
                head_width=0.04,width=0.01,fc='b',ec='k')
    pylab.text(x[i]+0.08,y[i]-0.08,'Sbj'+str(i),va='center')
pylab.axis('equal')

pylab.show()

HSVからRGBへ変換する

colorsysというモジュールにそのものズバリのcolorsys.hsv_to_rgb(h,s,v)という関数がある。引数はそれぞれ0.0以上1.0以下である必要があり、範囲を超えるとNoneが戻ってくるので注意する必要がある。

matlabのfindっぽいことがしたいけどpylabをimportするのは嫌

numpy.whereを使う。最後の[0]がポイント。

import numpy
index = numpy.where((a>200) & (b==0))[0]

matlabのnormっぽいことがしたいけどpylabを(略

numpy.linalg.normを使う。通常、numpyをimportすればnumpy.linalgもimportされている。

import numpy
n = numpy.linalg.norm(v)

WindowsのtkFileDialog.askopenfilenamesの戻り値を何とかする

tkFileDialog.askopenfilenamesで複数ファイルを選択した時の戻り値はLinux上ではファイル名を並べたtupleになるが、なぜかWindowsではスペース区切りのunicode文字列になってしまう(pyhon2.6および2.7で確認)。 スペース区切りなんだからsplit(' ')すりゃいいかと思いきや、パス内にスペースが含まれていると以下のように{ }でくくられた文字列になってしまうため、split(' ')ではうまくいかない。

オリジナルのパス

戻り値の文字列

'D:\work\400Hz 3.csv'

'{D:/work/400Hz 3.csv}'

んじゃ、split(' ')して順番に要素をチェックして、'{'が1文字目に現れる要素があれば'}'が最後に現れる要素までまとめてjoin(' ')しちゃえばいいよね!と思いきや、パス内に'}'が含まれていると今度は{ }でくくられず''でエスケープされる。ふがー!

オリジナルのパス

戻り値の文字列

'D:\work\400Hz -4} .csv'

'D:/work/400Hz-4}.csv'

というわけでぶつくさ言いながら書いたのが以下の関数。まだ不備があるかも知んないけどそれは そんな変な名前のファイルを使う方が悪い ということで。

def splitFilenames(filenames):
    tmplist = filenames.split(' ')
    newFilenames = []
    i = 0
    while i<len(tmplist):
        if tmplist[i][0] == '{': #space is included
            s = i
            while tmplist[i][-1] != '}':
                i+=1
            fname = ' '.join(tmplist[s:i+1])
            newFilenames.append(fname[1:-1])
        elif tmplist[i][-1] == '\\':
            s = i
            while tmplist[i][-1] == '\\':
                i+=1
            fname = ' '.join(tmplist[s:i+1])
            newFilenames.append(fname.replace('\\',''))
        else:
            fname = tmplist[i].replace('\\','')
            newFilenames.append(fname)
        i+=1
    return newFilenames

こんな風に使うと吉。

filenames = tkFileDialog.askopenfilenames()

if isinstance(filenames, unicode): #もっと良い判定方法があるかも
    filenames = splitFilenames(filenames)

IPythonのlexerを使ってIPythonの出力をHTML化する

IPythonの出力をpygmentsでデコレーション出来たらうれしいな、ということで。

from IPython.nbconvert.utils.lexers import IPyLexer
from pygments import  highlight
from pygments.formatters import HtmlFormatter

highlight('In [1]: import matplotlib.pyplot as plt', IPyLexer(python3=False), HtmlFormatter())

pipを使うとInsecurePlatformWarningとかいう警告が出る。

いろいろとややこしいのだけれど、要するにsecureな接続ができないと怒っている。ググるとこれまたいろいろな解決方法が出てくるのだけれど、個人的にはこれがお気に入り。

pip install requests[security]

securityなんてextrasなんか知らないと言われたら、たぶんインストール済みのrequestsのバージョンが古すぎる。

PsychoPyに付属のpythonでもhoge.py fooしたい。

python.orgのインストーラーでインストールしたpythonならhoge.py fooしたらsys.argv[1]でfooを取れるけど、PsychoPyをインストールして.pyをpython.exeに関連付けてhoge.py fooしてもsys.argvに引数が反映されない。 レジストリのHKEY_CURRENT_USER\SOFTWARE\Classes\Applications\python.exe\shell\open\commandの値に%*を付け加えるといい感じに使える。 もしかしたらHKEY_CLASSES_ROOTのどっかもいじらないといけないかも。regeditでpython.exeを検索するのが吉。

R

Excelからコピー

x <- read.table(stdin(),header=TRUE)
x <- read.table("clipboard",header=TRUE)

VC++

python/ctypesから使用できるDLLを作成

プロジェクトのプロパティのリンカの入力からモジュールの定義ファイルに$(TargetName).defなどと指定。

DLLのデバッグ

プロジェクトのプロパティで実行ファイルを指定する。作業ディレクトリをプロジェクトのディレクトリにしておかないとデバッグ出来ない。