ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

Numpy <-> Pillow <-> Python file object

集中切れたからブログ書く.

これが良い手法かどうかわからないが、numpyからpillowいったり、Python file objectからpillowいったり、pillowからPython file objectへコンバートしてみた。

環境

  • Python2.7.11
  • numpy==1.13.1
  • Pillow==4.2.1

多分だけど、3系もさほど変わらないと思う。

準備

>>> from PIL import Image
>>> import numpy as np
>>> import io

numpy -> pillow

>>> numpy_object = np.zeros([500, 500])
>>> Image.fromarray(numpy_object)
<PIL.Image.Image image mode=F size=500x500 at 0x103762450>
>>> Image.fromarray(numpy_object, mode='RGB')  # modeで画像のチャネルを指定できる
<PIL.Image.Image image mode=RGB size=500x500 at 0x103996B90>

pillow -> numpy

np.asarray()を使えばおk. 楽.

>>> pillow_object = Image.open('./assets/1.jpg')
>>> np.asarray(pillow_object).shape
(500, 500, 3)

pillow -> Python file object

要はbytes?

>>> pillow_object = Image.open('assets/1.jpg')
>>> buf = io.BytesIO()
>>> pillow_object.save(buf, 'jpeg', quality=25, optimize=True)  # メモリに書き込み。重い
>>> python_file_object = buf.getvalue()

コメントにも書いているけど、これが重い処理。できればこれやめたい。(画像の容量次第だししょうがないのかな。。。)

Python file object -> pillow

>>> f = open('assets/1.jpg')
>>> read_data = f.read()
>>> Image.open(io.BytesIO(read_data))
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2480x3507 at 0x103DF8710>

これはいい感じで早い。

雑感

pillowにするのは早いけど、pythonのfile objectにするのは遅いのか。。。。?

Pythonでシングルトン

速度計測したかったので、時間を測るログクラスを用意することにしたけど、毎回呼ぶところを固定するのも面倒だったのでシングルトンがあるじゃん!ってことで試してみた。けど、理解するのなかなか難しかった…

環境

実装

# -*- coding:utf8 -*-

from logging import getLogger
import time


logger = getLogger(__name__)


class Singleton(type):
    def __call__(cls, *args, **kwargs):
        try:
            return cls.__instance
        except AttributeError:
            cls.__instance = super(Singleton, cls).__call__(*args, **kwargs)
            return cls.__instance


class SpeedChecker(object):
    __metaclass__ = Singleton
    def __init__(self):
        self.start_time_ms = time.time()


    def log_elapsed_time(self, comment=''):
        """速度を計測する.

        :type string:
        :param comment: 何かあれば

        :rtype: void
        :return:
        """
        elapsed_time_ms = time.time() - self.start_time_ms
        logger.debug('elapsed_time: %f [sec] %s' % (elapsed_time_ms, comment))

参考

Python の メタプログラミング (__metaclass__, メタクラス) を理解する

amir.rachum.com

ところで

PythonにはcProfileというモジュールがあるのでそれを使ったほうが早いですorz

ここ最近でPythonの覚えたこと

ざつーな俺用まとめ。見てもいいことないのでブラウザバック。

  • python2.7.13
  • Interactiveで試した

やったことをどっかに残して置きたかっただけなのと、それぞれ個別に記事を投稿するのがめんどかったから。はい。

dictionaryのkey一覧がみたい

でかいレスポンスdictionaryを受け取ったときに、探索したいときに使った。

>>> d = {'a': 'a', 'b': ' b'}
>>> d.keys()
['a', 'b']

www.pythonweb.jp

attributeの一覧がみたい

よく知らないライブラリのクラスをObject化したときに、何を持っているのかを確認したときに便利。

>>> class Test():
...     def test():
...             pass
...
>>> test = Test()
>>> dir(test)
['__doc__', '__module__', 'test']

www.lifewithpython.com

ファイルの存在確認

そのまま。assertでチェックするといいかも。

>>> import os
>>> path = os.path.join('./', 'test', 'test.json')
>>> assert os.path.exits(path), 'File does  not exists.'

ファイルやディレクトリの有無を調べる - Python Tips

文字列フォーマット

format()とか使わずにやった。

>>> 'test %s' % ('test')
'test test'
>>> 'test %s, %s' % ('test2', 'test1')
'test test2, test1'

dackdive.hateblo.jp

jsonを扱う

import jsonで色々できる

>>> import json

dictionaryをjson文字列にする

>>> d = {'a': 'a'}
>>> json.dumps(d)
'{"a": "a"}'

json文字列をdictionaryにする

unicodeになる。

>>> a_json_string = json.dumps({'a':'a'})
>>> a_json_string
'{"a": "a"}'
>>> a = json.loads(a_json_string)
>>> a
{u'a': u'a'}

json文字列をファイルに書き込む

ややこしいけど、json.dump()でできる。

# 書き込み
>>> f = open('test.json', 'w')
>>> json.dump(json.dumps({'a':'a'}), f)
>>> import os
>>> os.path.exists('./test.json')
True
>>> f.close()
# 読み込み
>>> f = open('./test.json', 'r')
>>> json_file = f.read()
>>> json_file
'"{\\"a\\": \\"a\\"}"' 
# これはよくわかっていないのだが、最初の読み込みはなぜかstring
>>> j = json.loads(json_file)
>>> j
u'{"a": "a"}'  # string
# json stringをさらに読み込み後、dictionaryとなる
>>> jj = json.loads(j)
>>> jj
{u'a': u'a'}  # dictionary

18.2. json — JSON encoder and decoder — Python 2.7.13 documentation qiita.com iyukki.blog56.fc2.com stackoverflow.com

Python2系でハマるstring, unicode辺り

毎回はまる。辛い。

qiita.com qiita.com

Python packageの作り方

セキュアなファイルや、画像とかの格納場所はどこにすればいいのか。適当にmodule以下にstaticディレクトリを作って、そこで管理しやすいように作っている。

qiita.com

リモートワークをちょっと経験中

リモートワークの会社ではありませんが、諸事情あって、只今リモートワーク中です。

以前こんな本を読んだことがあります。

好きな企業さんの1つにソニックガーデンという会社があります。特徴として全社員リモートワークで働いています。

この本読んだときに、特に思ってもいませんでしたが、改めてはっとしたことをここにメモする。

リモートワークはお互いに信頼がないと(多分)うまくいかない

このご時世、社員通しは電話やメールでのやり取りではなく、ほとんどがチャットサービスを使ってやり取りしていると思う。

仕事の内容で指示、指摘などあると思うけど、書き方によっては「ムッ?(^ω^#」って思うことが多々ある。

テキストだけでは相手の気持ちをうまく汲み取れないことも起因していると思うが、それは人それぞれなので誰にでも起こうる話じゃないかなと思う。

それを避けるには、事前に仲の良いメンバーであったり、やり取りしている人間を知っている、または信頼しているのであれば、特に何も思わずスルーすることができる。

とあるチャットに新規に入ると、仲の良いメンバーは遠慮のないテキストを送りお互いやり取りしているが、それは信頼が築けているからだと思う。そうではない新規に入った自分から見ると「もうちょっと柔らかく書いたらいいのに」と心配になってしまった。その辺でズレが発生するのだろう。

これでもしトラブルになったら本当にどうでも良いことだと思う。直接面と向かってやればうまくいくことがリモートワークだとうまくいかなくなる。時間の無駄だし、ストレスにもなる。恐ろしい…

リモートワーク導入する前に、ちゃんと築かないといけないものがあるんだなと思った。

リモートワークは寂しい

「雑談ができない」とよく聞く。「はっはっはっ、雑談なんてそんなしていないし大丈夫大丈夫」と思いきや。

思った以上にさみしい。

オフィスにいるとき、たまたま居た人とあいさつ交わしたり、そこでちょっとだべったりするのって雑談に入るし、また雑談でヒントになって仕事がいくつか解決したことあるなって今更ながら思った。

あと、自分が作ったプログラムや、仕事がうまくいったときに「褒めてー!」って自慢するのがチャット越しというのがちと違和感。。。目の前や隣にいたらすぐできるのになんでだろ?

リモートワークは運動不足

自分だけかもしれませんが、一歩も外にでなくても仕事ができる。これまじビビる。

「リモートは仕事をやりすぎてしまう。仕事のやり過ぎに注意」って書いてあってそんな馬鹿なwって笑ってたけど、これ本当っぽい。パソコンが目の前にあって、ネットが繋がればいつまでもできてしまう。朝仕事しよって思ったらいつの間にか夜中ですよ。

そんなこんなで、動いていないからお腹もあまり減らないし、もともとお菓子とかもそんな食べる人間でもないので、部屋から全然でなくていいんですよ。ということで絶賛運動不足中です。これは困った。

区切りを付けて、走りにいったほうがいいんだろうな。頑張ろう。

雑感

改めてソニックガーデンすごいなと思った。

今度ちゃんとレビュー書く。