.. title:: 雑多なメモ Excel ~~~~~~~~~~ 差し込み印刷の桁設定 ```````````````````` Alt+F9でフィールドコード編集画面に入り,{MARGEFIELD "FIELDNAME" \\# 0.00}のようにする. GhostScript ~~~~~~~~~~~~~~~~~~~~~~ 複数のPSファイルをPDFに連結 ```````````````````````````````` .. code-block:: none gswin32c -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE#pdfwrite -sOutputFile=merged.pdf -dCompatibilityLevel#1.2 -f PSファイルを列挙 ImageMagick ~~~~~~~~~~~~~~~~~~~~~~ GIFアニメを分解する `````````````````````` .. code-block:: none convert +adjoin gif-animation.gif output.gif GIFアニメを合成する `````````````````````` .. code-block:: none convert -loop 0 -delay 5 -resize 200x200 anim*.gif gif-animation.gif Mathematica ~~~~~~~~~~~~~~~~~~~~~~ Notebookが置かれているディレクトリのdata.txtからReadListする ```````````````````````````````````````````````````````````````````````````````````` .. code-block:: none data=ReadList[DirectoryName[NotebookFilePath[Notebooks[][[1]]]]<>"data.txt", Number,RecordLists->True]; Matlab ~~~~~~~~~~~~ bar()で描いた棒グラフにerrorbar()を重ねる ```````````````````````````````````````````````````````` `Mathworks Japanのテクニカルソリューション `_ を参考に。 bar()のスタイルに'hist'を指定しているのがポイント。こんな面倒なことしなくても描けるようになっていればいいのに。 → :ref:`barErrorbar ` という関数を作りました。超いいかげんですが。 .. code-block:: Matlab 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なら以下のようにすると相対累積度数のグラフが描ける。 .. code-block:: ipythonconsole In [1]: pylab.hist(data,normed=True,cumulative=True) このままpylab.histをnumpy.histogramで置き換えるとcumulativeなんて知らないと怒られる。 仕方がないのでこのようにする。 .. code-block:: ipythonconsole In [2]: (n,b) = numpy.histogram(data,normed=True) In [3]: relcumhist = numpy.cumsum(n*numpy.diff(b)) numpyで行列中のNaNではない値のインデックスを得る ```````````````````````````````````````````````````````` matlabなら行列AにおいてNaNではない値のインデックスを得るには .. code-block:: Matlab >> 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の比較は偽になる」** という謎の性質を活かして以下のようにする。 .. code-block:: ipythonconsole 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 "", line 1, in 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(' ')ではうまくいかない。 .. csv-table:: :delim: $ オリジナルのパス$戻り値の文字列 'D:\\work\\400Hz 3.csv'$'{D:/work/400Hz 3.csv}' んじゃ、split(' ')して順番に要素をチェックして、'{'が1文字目に現れる要素があれば'}'が最後に現れる要素までまとめてjoin(' ')しちゃえばいいよね!と思いきや、パス内に'}'が含まれていると今度は{ }でくくられず'\'でエスケープされる。ふがー! .. csv-table:: :delim: $ オリジナルのパス$戻り値の文字列 'D:\\work\\400Hz -4} .csv'$'D:/work/400Hz\ -4\}\ .csv' というわけでぶつくさ言いながら書いたのが以下の関数。まだ不備があるかも知んないけどそれは **そんな変な名前のファイルを使う方が悪い** ということで。 :: def splitFilenames(filenames): tmplist = filenames.split(' ') newFilenames = [] i = 0 while i