C言語 fgets関数 引数 標準入力
自分の研究が大詰めなので久々の更新になってしまった。
C言語の標準ライブラリに、fgetsがある
char *fgets(char *line, int maxline, FILE *fp)
標準入力が3番目の引数に使えることをさっき知ったのでそのメモ。
使い方としては
#include<stdio.h> int maxline=100; int main() { char line[maxline]; fgets(line, maxline, stdin); }
stdinと指定すればよいらしい
勉強になりました。
pandasで0の要素を欠損値(NaN)にする方法
データフレーム型を扱うときに0.0を欠損値(NaN)にしたい場面は多い(私の場合)
今までは
import pandas as pd a = pd.read_csv("sample.csv")
で読み込み
import numpy as np b = np.array(a)
でnumpyの配列に変換し
for n in range(b.size): if b[n] == 0.0: b[n] = float(NaN)
で欠損値にしていた.
しかし,この手法は相当面倒である.
またデータフレーム型に直さなければならないし
そこで,画期的(私にとっては)な方法を知ってしまった.
import pandas as pd a = pd.read_csv("sample.csv") b = a[a!=0.0]
これだけでできてしまった.
これまでの苦労は...(こんなことは日常茶飯事なので前向きに)
pandasでcolumnsとindexの名前を変更する方法
今回はpandasを使ってデータフレーム型のcolumnsとindexの名前を変える方法をかる〜く紹介
>>>data a b 0 4.5 2.1 1 5.4 8.3 2 7.6 5.5
dataに対して名前を変更する
>>>data.columns = ['name1','name2'] >>>data.index = ['index0','index1','index2'] >>>data name1 name2 index0 4.5 2.1 index1 5.4 8.3 index2 7.6 5.5
このように簡単に変更できる.
データ数が膨大になってくると面倒
weka csv読み込み シェル上からエラー特定ワンライナー
筆者が研究中にcsv形式のデータをwekaに読みこませるとエラーが出たので,原因部分を特定するために書いたワンライナーをメモ
pythonのpandasなどでは統計量をまとめて取得できる.
import pandas as pd data = pd.read_csv("sample.csv") a = data.describe()
これによりaには
count mean std min 25% 50% 75% max
が格納されている.
各統計量の説明は本筋ではないので省く.
このような処理によって以下の様なデータができたとして
,count,mean,std,min,25%,50%,75%,max file1,46,5.0,9.0,0.0,3.0,5.5,7.2,11.0 file2,65,6.7,8.0,0.0,3.2,6.5,8.8,12.1 ...
筆者の場合,約9000行,650列ほどデータがあるのでエラーがあると特定するのが困難である.
そこで,シェル上で以下を実行し,その都度wekaに読み込ませて原因を特定する手法をとった.
$cat filename.csv | grep count | awk -F, '{printf("%s,",$1);{for(i=n;i<m;i++)printf("%s,",$i)}printf("%s\n",$m)}' > newfile.csv $cat filename.csv | grep file | awk -F, '{printf("%s,",$1);{for(i=n;i<m;i++)printf(%lf,",$i)}printf("%lf\n",$m)}' >> newfile.csv
いわゆるシェル芸(ワンライナー)というものである.
2行になっているのは許して下さい(こんなのシェル芸じゃないという意見は受け入れます.)
nとmの値を書き換えてエラーが出たら範囲を半分,さらにその半分と、エラーの位置を特定していく.
結果的には % という文字が原因だった
wekaでは%が読み込めないようだ(設定によるだろうか?)
%をperに書き換えてwekaに読み込ませることに成功した.
結構な時間を原因特定にかけてしまった...(もう同じミスはしないだろう)
同じミスをした人が早くこの記事を見つけることを願うばかりである.
pandasを使ってcsvデータを読み書き
pandasを使ってデータフレーム(DataFrame)型のデータをいじる方法をメモ.
私がよく使うものだけ.
まず
import pandas as pd
pdが一般的らしい.
そしてcsvファイルを読み込む(csvとはカンマ区切りのデータ,スペース区切りはssv,タブ区切りはtsv).
オプションで指定すればssv,tsvも読み込めるがデフォルトはcsv.
/home/user/sample.csvを読み込む
#index列がない場合 a = pd.read_csv("/home/user/sample.csv") #index列がある場合 a = pd.read_csv("/home/user/sample.csv",index_col=0)
次は書き込み(出力)
/home/user/sample-a.csv に出力
#index列を出力しない場合 a.to_csv("/home/user/sample-a.csv",index=False) #index列ごと出力する場合 a.to_csv("/home/user/sample-a.csv")
こんな感じです。
最近は研究が忙しくブログがかけない.
python ディレクトリ(フォルダ)内のファイル名をlistで取得
pythonを用いてディレクトリ内のファイル一覧をlist型で取得する。
この操作はかなり使うことが多いと思う。(私はよく使う)
/home/user/Hatenaというディレクトリの直下に a.txt, b.txt, c.txt が存在すると仮定して
各ファイル名を出力させる
import os filenames = os.listdir("/home/user/Hatena") for txtfile in sorted(filenames): print txtfile
出力は
a.txt b.txt c.txt
が得られる。
ディレクトリの中でもソートされていると思うが私は念のためソートする事が多い。
※最近はpathlibを使うことが多いらしいです.
python でFizzBuzz問題(C でナベアツ問題)
プログラミングの有名な問題のひとつに "FizzBuzz問題" がある。
1,2,3,4,5,6,7...のような数列の要素が
3で割り切れる場合は Fizz
5で割り切れる場合は Buzz
両方で割り切れる場合は FizzBuzz
と出力するような問題である。
ほしい出力は以下。
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 ...
この問題を python で実装していきたいと思う
早速コードを書いてみた
for i in range(1,100): if i % 15 == 0: print "FizzBuzz" elif i % 3 == 0: print "Fizz" elif i % 5 == 0: print "Buzz" else: print i
これで上のような出力が得られるはずである。
もっと良いアルゴリズムがあるんだろうか?
ご存じの方は教えて下さいm(..)m
そういえばこの問題「ナベアツ問題」っていってるのどこかで見たな(笑)
実装してみますか
どうせだからC言語で
3の倍数と3の付く数字の時はアホになって、5の倍数で犬になります。
ちょっと難しいな...
#include<stdio.h> int i; int main(void) { for(i=0;i<15;i++) { if(i%15==0) printf("ワホーン!\n"); else if(i%10==3 || i%3==0) printf("サァァン\n"); else if(i%5==0) printf("ゴフッッツ\n"); else printf("%d\n",i); } } //これは6でもサァァンっていうやつだな。
ナベアツさんには程遠いな...
個人的にはエド・はるみさんとか藤崎マーケットさんのネタが好きだなぁ
...以上!!