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