Sponsored Link

月別アーカイブ: 7月 2014

(39) シェルスクリプトファイルを作成・実行

(39) シェルスクリプトファイルを作成・実行

シェルスクリプトファイル exec.sh を作成し、実行属性を付与する。

>>> fh = open('exec.sh','w')
>>> fh.write('#!/bin/sh\n')
>>> fh.write('export LD_LIBRARY_PATH=/usr/local/lib\n')
>>> fh.write('gcc --version\n')
>>> fh.write('#end')
>>> fh.close()
>>>
>>> import subprocess as sp
>>> args = ['chmod','+x','./exec.sh']
>>> sp.call(args)
0

作成したシェルスクリプトファイルを実行する。

>>> import subprocess as sp
>>> args = ['./exec.sh']
>>> sp.call(args)
gcc (GCC) 4.9.0
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

0

(38) ファイル、ディレクトリのフルパスを取得

(38) ファイル、ディレクトリのフルパスを取得

os.path.abspath を使用し、ファイル、ディレクトリのフルパスを取得する。

>>> import os
>>>
>>> os.path.abspath('./')
'/home/user/tmp'
>>>
>>> os.path.abspath('data.txt')
'/home/user/tmp/data.txt'
>>>
>>> os.path.abspath('../data.txt')
'/home/user/data.txt'

(37) subprocessで外部のプログラムを実行

(37) subprocessで外部のプログラムを実行

subprocess.call を使用して外部プログラムを実行してみる。

call は、外部プログラムの終了を待って復帰する。
call は、外部プログラムの戻り値を返す。

>>> import subprocess as sp
>>>
>>> arg = ['gcc','--version']
>>>
>>> ret = sp.call(arg)
gcc (GCC) 4.9.0
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

>>>
>>> ret
0

subprocess.Popen でも同じことができる。

>>> import subprocess as sp
>>>
>>> arg = ['gcc','--version']
>>>
>>> proc = sp.Popen(arg, stdout=sp.PIPE)
>>> proc.returncode
0
>>> stdoutData, stderrData = proc.communicate()
>>>
>>> stdoutData
'gcc (GCC) 4.9.0\nCopyright (C) 2014 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n'
>>>
>>> out = stdoutData.split('\n')
>>> out[0]
'gcc (GCC) 4.9.0'
>>>
>>> out[1]
'Copyright (C) 2014 Free Software Foundation, Inc.'
>>>
>>> out[2]
'This is free software; see the source for copying conditions.  There is NO'
>>>
>>> out[3]
'warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.'

(36) 配列データをシャッフル

(36) 配列データをシャッフル

random.shuffle を使用すると、配列要素をシャッフルできる。

>>> import random
>>>
>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>> random.shuffle(a)
>>> a
[6, 9, 1, 4, 5, 0, 2, 8, 7, 3]

文字列配列でもOK!

>>> b = ['aaa','BBB','ccc','dDd','eEE']
>>> b
['aaa', 'BBB', 'ccc', 'dDd', 'eEE']
>>>
>>> random.shuffle(b)
>>> b
['BBB', 'aaa', 'dDd', 'ccc', 'eEE']

numpy配列の場合は numpay.random.shuffle で同じことができる。

>>> import numpy as np
>>> import numpy.random as nr
>>>
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>
>>> nr.shuffle(a)
>>> a
array([0, 6, 4, 3, 5, 8, 9, 2, 7, 1])

応用

ファイル検索で得られたファイルリストをシャッフルする。

以下のようなテキストファイルが置かれたディレクトリに対してファイル検索する。

[user@linux]$ ll ./sub/
合計 28
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text001.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text002.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text003.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text004.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text005.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text006.txt
-rw-rw-r--. 1 user user 35  7月 10 23:35 2014 text007.txt

glob を使ってファイルリストを取得し、これをシャッフルしてみる。

>>> import glob
>>> files = glob.glob('./sub/*.txt')
>>> files
['./sub/text002.txt', './sub/text005.txt', './sub/text006.txt',
 './sub/text003.txt', './sub/text001.txt', './sub/text004.txt',
 './sub/text007.txt']
>>>
>>> import random
>>> random.shuffle(files)
>>> files
['./sub/text005.txt', './sub/text002.txt', './sub/text004.txt',
 './sub/text003.txt', './sub/text001.txt', './sub/text006.txt',
 './sub/text007.txt']

(35) numpyでCSVファイルの読み書き

(35) numpyでCSVファイルの読み書き

3行6列のデータ配列を持つ CSVファイル を用意した。

[user@linux]$ cat test.csv
10,11,12,13,14,15
20,21,22,23,24,25
30,31,32,33,34,35

このファイルを numpy.loadtxt でリードしてみる。

>>> import numpy as np
>>> a = np.loadtxt('test.csv', delimiter=',')
>>> a
array([[ 10.,  11.,  12.,  13.,  14.,  15.],
       [ 20.,  21.,  22.,  23.,  24.,  25.],
       [ 30.,  31.,  32.,  33.,  34.,  35.]])

全要素の値を2倍した後、その配列を numpy.savetxt で CSVファイルとしてセーブしてみる。

>>> b = a * 2
>>> b
array([[ 20.,  22.,  24.,  26.,  28.,  30.],
       [ 40.,  42.,  44.,  46.,  48.,  50.],
       [ 60.,  62.,  64.,  66.,  68.,  70.]])
>>> np.savetxt('out.csv', b, delimiter=',', fmt='%d')

正しく出力できている!

[user@linux]$ cat out.csv
20,22,24,26,28,30
40,42,44,46,48,50
60,62,64,66,68,70

numpyを使わず、csvパッケージを使う方法もある。
Read

>>> import csv
>>> with open('test.csv', newline='') as fh:
...     spamreader = csv.reader(fh, delimiter=',')
...     for row in spamreader:
...         a.append(row)
...
>>> a
[['10', '11', '12', '13', '14', '15'], ['20', '21', '22', '23', '24', '25'], ['30', '31', '32', '33', '34', '35']]
>>>

Write

>>> with open('out2.csv', "w") as fh:
...     writer = csv.writer(fh, lineterminator="\n")
...     writer.writerows(a)
...
>>>
[user@linux]$ cat out2.csv
10,11,12,13,14,15
20,21,22,23,24,25
30,31,32,33,34,35
[user@linux]$

(34) 配列の情報を得る色々な手段

(34) 配列の情報を得る色々な手段

a[ 4 ][ 3 ][ 2 ] の3次元配列を作成し、この配列のいろいろな情報を取得してみる。

>>> import numpy as np
>>> a = np.floor(np.random.rand(4,3,2)*10)
>>> a
array([[[ 6.,  6.],
        [ 2.,  5.],
        [ 4.,  4.]],

       [[ 9.,  4.],
        [ 8.,  7.],
        [ 1.,  9.]],

       [[ 3.,  0.],
        [ 5.,  9.],
        [ 3.,  8.]],

       [[ 4.,  4.],
        [ 4.,  6.],
        [ 8.,  8.]]])

次数

>>> a.ndim
3
>>> a[0].ndim
2
>>> a[0][0].ndim
1

各次元の要素数

>>> a.shape
(4, 3, 2)
>>> a[0].shape
(3, 2)
>>> a[0][0].shape
(2,)

配列の要素数

>>> a.size
24
>>> a[0].size
6
>>> a[0][0].size
2

(33) minとargmin

(33) minとargmin

(32) maxとargmax と似た関数で、
min ( n ) は、n次元目の最小値を取得できる。
argmin ( n ) は、n次元目の最小値を持つ要素のインデックスを取得できる。

乱数で配列aを作成する。

>>> import numpy as np
>>> a = np.floor(np.random.rand(4,3)*10)
>>> a
array([[ 3.,  3.,  0.],
       [ 0.,  5.,  4.],
       [ 8.,  0.,  1.],
       [ 1.,  5.,  6.]])

列方向の最小値、最小値を持つ要素のインデックスを取得してみる。

>>> a.min(0)
array([ 0.,  0.,  0.])
>>> a.argmin(0)
array([1, 2, 0])

行方向の最小値、最小値を持つ要素のインデックスを取得してみる。

>>> a.min(1)
array([ 0.,  0.,  0.,  1.])
>>> a.argmin(1)
array([2, 0, 1, 0])

また、min, argmin の引数で軸番号を指定しない場合、全要素を対象に最小値を探してくれる。

>>> a.min()
0.0
>>>
>>> a.argmin()
2

a.argmin()は、配列を1次元に展開したときのインデックス値を返す仕様のようだ。

(32) maxとargmax

(32) maxとargmax

仕様

max ( n ) は、配列の n 次元目の最大値を取得できる。
argmax ( n ) は、配列の n 次元目の最大値を持つ要素のインデックスを取得できる。

使用例

配列 a を乱数で作成する。

>>> import numpy as np
>>> a = np.floor(np.random.rand(4,3)*10)
>>> a
array([[ 3.,  3.,  0.],
       [ 0.,  5.,  4.],
       [ 8.,  0.,  1.],
       [ 1.,  5.,  6.]])

[0] 列方向

列方向(↓)の最大値および、最大値を持つ要素のインデックスを取得してみる。
目視で調べると期待する結果は以下の通りだが…
0列目 a[ * ][ 0 ] では、a[ 2 ][ 0 ] の 8
1列目 a[ * ][ 1 ] では、a[ 1 ][ 1 ], a[ 3 ][ 1 ] の 5
2列目 a[ * ][ 2 ] では、a[ 3 ][ 2 ] の 6

>>> a.max(0)
array([ 8.,  5.,  6.])
>>> a.argmax(0)
array([2, 1, 3])

OK だ。
ただし、同じ値の要素が複数個存在する場合は、インデックス値の小さな方のみ教えてくれる。

[1] 行方向

次に行方向(→)の最大値および、最大値を持つ要素のインデックスを取得してみる。
目視で調べると期待する結果は以下の通りだが…
0行目 a[ 0 ][ * ] では、a[ 0 ][ 0 ], a[ 0 ][ 1 ] の 3
1行目 a[ 1 ][ * ] では、a[ 1 ][ 1 ] の 5
2行目 a[ 2 ][ * ] では、a[ 2 ][ 0 ] の 8
3行目 a[ 3 ][ * ] では、a[ 3 ][ 2 ] の 6

>>> a.max(1)
array([ 3.,  5.,  8.,  6.])
>>> a.argmax(1)
array([0, 1, 0, 2])

OK だ。
こちらも同じ値の要素が複数個存在する場合は、インデックス値の小さな方のみ教えてくれる。

その他

当然だが 3次元以上でも同じことができる。

また、max, argmax の引数で軸番号を指定しない場合、全要素を対象に最大値を探してくれる。
この場合、a.argmax()は、配列を1次元に直列に展開したときのインデックス値を返す仕様だ。

>>> a.max()
8.0
>>>
>>> a.argmax()
6

確かに最大値8はaを直列展開後に index=6の位置にある。

>>> a
array([[ 3.,  3.,  0.],
       [ 0.,  5.,  4.],
       [ 8.,  0.,  1.],
       [ 1.,  5.,  6.]])
>>> a.reshape(-1)
array([ 3.,  3.,  0.,  0.,  5.,  4.,  8.,  0.,  1.,  1.,  5.,  6.])

(31) eclipse+PyDevで快適環境

(31) eclipse+PyDevで快適環境

統合開発環境eclipseにPyDevプラグインをインストールすると色々と便利!

インストール手順

(1) eclipse(ver.4.0を使用中)を起動
(2) [help] – [Install New Software…] メニューを選択
(3) [Work with] に http://pydev.org/updates を入力してリターン
(4) [Name] に表示された PyDev  と PyDev Mylyn Integration を選択し、インストール実行

初期設定

(1) eclipseを再起動
(2) [Window] – [Preferences] メニューを選択
(3) [PyDev] – [Interpreters] – [Python Interpreter] を選択
(4) [Python Interpreters] にプログラム実行時に使いたいpythonを指定 (例. /usr/bin/python)

コード編集

入力補助機能がうれしい!
20140710_01

デバッグ実行

Java,C/C++みたいにデバッグできる!
20140710_02

(30) 配列各要素の累乗を算出

(30) 配列各要素の累乗を算出

5行3列の乱数配列を作成する。

>>> import numpy as np
>>> a = np.floor(np.random.rand(5,3) * 10)
>>> a
array([[ 7.,  8.,  4.],
       [ 5.,  2.,  7.],
       [ 6.,  7.,  7.],
       [ 4.,  2.,  3.],
       [ 2.,  6.,  6.]])

numpy.powerで累乗を算出する。

>>> np.power(a,2)
array([[ 49.,  64.,  16.],
       [ 25.,   4.,  49.],
       [ 36.,  49.,  49.],
       [ 16.,   4.,   9.],
       [  4.,  36.,  36.]])