Python:numpy

numpy.png

numpyの便利機能

配列の最大値・最小値を求める

print("最小値%d,最大値%d"%(numpy.amin(data),numpy.amax(data)));

配列全体をshortをfloatに変換

ushortdata=numpy.fromfile(fp,dtype=numpy.uint16);
floatdata=numpy.array(ushortdata,dtype='f')

値の範囲を求める

numpy.ptp(data)

ptpは「peak to peak」という意味
公式リファレンス
データの値がshortやcharとか小さい値の時は、ptpするとマイナスの値が返ってくることがある
それは範囲が大きすぎて正負逆転してしまったから、正しい値ではない。

一気に正規化

fdata=numpy.array(data,dtype='f')
fdata=fdata/numpy.amax(fdata)*255.0;#0-255に正規化

clamp機能

import numpy;
data=[0,1,2,3,4,5,6];
print("before")
for f in data:
    print f;
data=numpy.clip(data,1,3)
print("after")
for f in data:
    print f;

出力結果
before
0
1
2
3
4
5
6
after
1
1
2
3
3
3
3

ファイルに書き込み

import numpy;
a=numpy.zeros((360,200));#360×200 で0で埋めつくされた配列の宣言
fp=open("data.bin","wb");
a.tofile(fp);#ファイルに書き込む
fp.close();

初期化

arrayを使うにはnumpyが必要。

初期化

import numpy
a=numpy.empty((360,200),dtype=numpy.float32);#360×200 でシングルfloat型

dtype データタイプ

こんなふうに使う

data=numpy.fromfile(fp,dtype=numpy.int8);

Data type Description
bool Boolean (True or False) stored as a byte
int Platform integer (normally either int32 or int64)
int8 Byte (-128 to 127)
int16 Integer (-32768 to 32767)
int32 Integer (-2147483648 to 2147483647)
int64 Integer (9223372036854775808 to 9223372036854775807)
uint8 Unsigned integer (0 to 255)
uint16 Unsigned integer (0 to 65535)
uint32 Unsigned integer (0 to 4294967295)
uint64 Unsigned integer (0 to 18446744073709551615)
float Shorthand for float64.
float16 Half precision float: sign bit, 5 bits exponent, 10 bits mantissa
float32 Single precision float: sign bit, 8 bits exponent, 23 bits mantissa
float64 Double precision float: sign bit, 11 bits exponent, 52 bits mantissa
complex Shorthand for complex128.
complex64 Complex number, represented by two 32-bit floats (real and imaginary components)
complex128 Complex number, represented by two 64-bit floats (real and imaginary components)

こんなふうにフォーマットを指定してもいい

fdata=numpy.array(data,dtype='f')

フォーマット C での型 Python
x pad byte no value
c char 長さ 1 の文字列
b signed char 整数型 (integer)
B unsigned char 整数型
h short 整数型
H unsigned short 整数型
i int 整数型
I unsigned int long 整数型
l long 整数型
L unsigned long long整数型
q long long long 整数型
Q unsigned long long long 整数型
f float 浮動小数点型
d double 浮動小数点型
s char[] 文字列
p char[] 文字列
P void * 整数型

2次元配列の内容を画像に出力する

fdata=numpy.array(data,dtype='f')
fdata=fdata/numpy.amax(fdata)*255.0;#0-255に正規化
uchardata=numpy.array(fdata,dtype='B');
for x in range(0,xynum):
    for y in range(0,xynum):
        val=(uchardata[(slicez*xynum+y)*xynum+x]);
        im.putpixel( (x,y),val);

一気にデータを出力

するにはimage.putdara(配列)がいい
簡単に、10×10の縞々な絵を書いてみる

# -*- coding: cp932 -*-
import numpy;
from PIL import Image
data=numpy.zeros((10*10),dtype="B");
for y in range(0,10):
    for x in range(0,10,2):
        data[y*10+x]=255;
im=Image.new( 'L', ( 10, 10 ) );
im.putdata(data);
im.save("out.png");
out.png

←ちょうちっさいけど、できたのがコレ。x=偶数が白になっている。

サポートサイト Wikidot.com