ブログ

割とコンピュータよりの情報をお届けします。

コンピュータ

Python imageの読み込みだけ

Pythonで画像を読み込んで保存形式を変更する。

Pythonで画像を読み込んで保存形式を変更する。
png形式のファイルを読み込むとRGBA形式になっているようです。これを、RGBに直しておかないとJPEGで保存できません。

from PIL import Image

def main():
    img = Image.open('plot201803.png');
    img = img.convert("RGB")
    img.save('plot201803mod.jpg', 'JPEG', qualtiy=20, optimize=True);

if __name__ == '__main__':
    main()

≫ 続きを読む

2018/03/22 コンピュータ   TakeMe

matplotlib jpeg保存

Matplotlibのsavefigに最近追加されている機能

matplotlibは昔JPEG保存に手間がかかると聞いていたが、普通にできるようになっている。
qualityも指定できるようになっている。1-100で指定できるみたい。ただし、おおむね20未満は質だけが悪くなってあまりサイズの抑制効果が得られない。


import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
    width = zfront - zback;
    a = 1 / width
    b = - a * (zfront + zback) / 2
    return np.array([[1,0,0,0],
                     [0,1,0,0],
                     [0,0,a,b],
                     [0,0,0,zback]])
proj3d.persp_transformation = orthogonal_proj

def main():

    r = 50.0;
    theta = np.arange(0.0, 360.0, 30.0);
    x = np.array([]);
    y = np.array([]);
    z = np.array([]);

    for i in range(10):
        x_ = r * np.cos(theta / 180.0 * np.pi);
        y_ = r * np.sin(theta / 180.0 * np.pi);
        z_ = 10.0 * i * np.ones(x_.shape[0]);
        
        x = np.append(x, x_);
        y = np.append(y, y_);
        z = np.append(z, z_);
    
    X = np.array([x, y, z, np.ones(x.shape[0])]);
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    ax.scatter3D(X[0], X[1], X[2]);
    ax.set_aspect('equal')
    plt.grid()
    plt.savefig('plot20180321.jpg', format='jpeg', quality=10);
    plt.show();

if __name__ == '__main__':
    main()

≫ 続きを読む

2018/03/21 コンピュータ   TakeMe

Pythonで3次元プロット と回転

Pythonで3次元プロットをする前に座標回転を追加してみた。

前のコードに追加を行った。

回転行列をかけるということで座標変換を行う。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
    width = zfront - zback;
    a = 1 / width
    b = - a * (zfront + zback) / 2
    return np.array([[1,0,0,0],
                     [0,1,0,0],
                     [0,0,a,b],
                     [0,0,0,zback]])
proj3d.persp_transformation = orthogonal_proj

def rotX(X):
    theta = X / 180.0 * np.pi;
    Rx = np.array([[1,0,0,0],
                   [0,np.cos(theta),np.sin(theta),0],
                   [0,-np.sin(theta),np.cos(theta),0],
                   [0,0,0,1]]);
    return Rx;

def rotY(Y):
    theta = Y / 180.0 * np.pi;
    Ry = np.array([[np.cos(theta),0,-np.sin(theta),0],
                   [0,1,0,0],
                   [np.sin(theta),0,np.cos(theta),0],
                   [0,0,0,1]]);
    return Ry;

def rotZ(Z):
    theta = Z / 180.0 * np.pi;
    Rz = np.array([[np.cos(theta),np.sin(theta),0,0],
                   [-np.sin(theta),np.cos(theta),0,0],
                   [0,0,1,0],
                   [0,0,0,1]]);
    return Rz;

def trans(x):
    Tr = np.array([[1,0,0,x[0]],
                   [0,1,0,x[1]],
                   [0,0,1,x[2]],
                   [0,0,0,1]]);
    return Tr;

def main():

    r = 50.0;
    theta = np.arange(0.0, 360.0, 30.0);
    x = np.array([]);
    y = np.array([]);
    z = np.array([]);

    for i in range(10):
        x_ = r * np.cos(theta / 180.0 * np.pi);
        y_ = r * np.sin(theta / 180.0 * np.pi);
        z_ = 10.0 * i * np.ones(x_.shape[0]);
        
        x = np.append(x, x_);
        y = np.append(y, y_);
        z = np.append(z, z_);
    
    X = np.array([x, y, z, np.ones(x.shape[0])]);
    X = np.dot(rotX(45.0), X);
    X = np.dot(rotY(45.0), X);
    X = np.dot(rotZ(10.0), X);
    X = np.dot(trans([10, 10, -10]), X);
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    ax.scatter3D(X[0], X[1], X[2]);
    ax.set_aspect('equal')
    plt.grid()
    plt.savefig('plot201803.svg');
    plt.show();

if __name__ == '__main__':
    main()

≫ 続きを読む

2018/03/20 コンピュータ   TakeMe

ヒストグラムを作成

Pythonヒストグラムの作成について

Pythonでヒストグラムを作成してみた。
バーの周辺にエッジをなくす場合にはedgecolor="none"とするらしい。

import numpy as np
import matplotlib.pyplot as plt

R = np.random.randn(100000) * 2. + 10.;
plt.hist(R, bins=50, edgecolor="black");
plt.grid();
plt.savefig('test2.png');
plt.show();

≫ 続きを読む

2018/03/16 コンピュータ   TakeMe

Pythonで3次元プロット

Pythonで3次元プロットしてみた

Pythonで3次元プロットしてみたが、なかなか難しいのがパースペクティブ表示になっているところ。

参考をみて直してもらった。

 

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
    width = zfront - zback;
    a = 1 / width
    b = - a * (zfront + zback) / 2
    return np.array([[1,0,0,0],
                     [0,1,0,0],
                     [0,0,a,b],
                     [0,0,0,zback]])
proj3d.persp_transformation = orthogonal_proj

r = 50.0;
theta = np.arange(0, 360.0, 30);

x = np.array([]);
y = np.array([]);
z = np.array([]);

for i in range(10):
    x_ = r * np.cos(theta / 180 * np.pi);
    y_ = r * np.sin(theta / 180 * np.pi);
    z_ = 10. * i * np.ones(x_.shape[0]);

    x = np.append(x, x_);
    y = np.append(y, y_);
    z = np.append(z, z_);

fig = plt.figure();
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(x, y, z);
plt.show();

≫ 続きを読む

2018/03/15 コンピュータ   TakeMe

Pythonで一定間隔で実行

Pythonで一定間隔で実行することが難しい。JavaScriptではsetInterval()が使えるのだが,Pythonは標準で用意されていないよう

Pythonで一定間隔であるコードを実行する方法を知べていたがなかなか見つからない。
標準ではないのかもしれない。微妙にこれでいいのか不安。

(今更気付いたがPythonの関数内では関数の外の変数も読めてしまうのですね)

 

import threading
import time
import sys

threadStop = False;
count = 0;
def run():
    global count, threadStop;
    count += 1;
    if threadStop != True:
        thread = threading.Timer(1, run)
        thread.start()
        print('run {0}'.format(count));
    else:
        threadStop = False;
    
    

thread = threading.Thread(target=run);
thread.start();

try:
    while (True):
        time.sleep(1);
    
except KeyboardInterrupt:
    threadStop = True;
    while threadStop == False:
        time.sleep(0.01);
    sys.exit();

(2018/08/25追記: .NETの支援があれば別の方法も使える)

≫ 続きを読む

2018/03/14 コンピュータ   TakeMe
タグ:Python

PythonとJavaScriptの時刻やり取り

PythonとJavaScriptのDateのやり取りで困ったことを書いてみる。

PythonのdatetimeとJavaScriptのDateのやり取りにかなり苦労した。

最終的に以下のようなコードができた。
うまくいっているのかがよくわからない。
なかなか思ったような処理にならない。難しい。最後はtzlocalモジュールを使用してつじつま合わせをしている。

from datetime import datetime, timedelta, timezone
from tzlocal import get_localzone
import pytz
import time

#tstr = '2016-11-29T10:00:30Z'

def fromtstr(tstr):
    try:
        tdatetime = datetime.strptime(tstr, '%Y-%m-%dT%H:%M:%S.%fZ').replace(tzinfo=timezone.utc);
    except:
        tdatetime = datetime.strptime(tstr, '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=timezone.utc);
    return tdatetime;

def valueOf(datetime):
    return int(time.mktime(datetime.timetuple())*1e3 + datetime.microsecond/1e3);

def fromValue(value):
    tz = get_localzone() # local timezone 
    d = datetime.now(tz) # or some other local date 
    utc_offset = d.utcoffset().total_seconds()
    epoch = datetime(1970, 1, 1).replace(tzinfo=timezone.utc)
    val = epoch + timedelta(milliseconds=value+utc_offset*1000)
    return val;

 

≫ 続きを読む

2018/03/14 コンピュータ   TakeMe

Puttyで鍵を作る

puttygenで生成した秘密鍵ファイルはopensshと互換性がない。

puttygenで生成した秘密鍵ファイルはopensshと互換性がない。
昨日これを知らずにかなり苦慮した。

メニューバーからExport OpenSSH keyを選択して互換性のあるキーを生成しないとうまく使用できない。

ただし、Puttyはかなりよく使われるソフトであるためWindows用のソフトの場合にはputtygenで生成したファイルをそのまま使用できる場合も多い。

≫ 続きを読む

2018/03/03 コンピュータ   TakeMe

matplotlib polarプロットの中心付近

matplotlibのかなり古いバージョンから標準では半径軸の原点は中心にあった。

matplotlibのかなり古いバージョンから標準では半径軸の原点は中心にあった。

いつの頃からか、

ax.set_rorigin(-2.5)

で半径軸の原点を外側にずらすことができるようになっている。

があった(ページ中段のScatter plot on polar axis, with offset origin)。

中心から埋まらない表示は結構使うと思うが、なかなか難しい。上で参照している例では

ax.set_rorigin(-2.5)
ax.set_theta_zero_location('W', offset=10)

の後は普通にplt.plot()でも良い?

≫ 続きを読む

2018/02/27 コンピュータ   TakeMe

WinPythonでPyinstaller

WinPythonでPyInstallerを使用したところファイルサイズが大きくなった。

WinPythonでPyInstallerを使用したところファイルサイズが大きくなった。

相当余計なモジュールも含んでいるようだ。

specファイルにパッケージに含めないファイルを書けばいいのだろうがかなり面倒。

WinPython Zeroで必要なものだけインストールしてみるのでも良い。
(20180908追記: pyinstallerについてばバージョンが上がって少し改善がはいっている)

≫ 続きを読む

2018/02/21 コンピュータ   TakeMe