Pynote

Python、機械学習、画像処理について

numpy - 既存のリソースから作成する。 (copy, frombuffer, loadtxt, etc)

一覧表

名前 説明
numpy.array リスト、タプルなど → 配列
numpy.copy deep copy
numpy.frombuffer bytes → 1次元配列
numpy.fromfile バイナリファイル → 1次元配列
numpy.fromfunction 関数 → 配列
numpy.fromiter iterable → 1次元配列
numpy.fromstring 文字列 → 1次元配列
numpy.loadtxt テキストファイル → 配列

numpy.array

指定した入力 object (リスト、タプルなど) から配列を作成する。

関数

numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)

# リストから ndarray を作成する。
a = np.array([1, 2, 3])
print(a.dtype)  # int64
print(a)  # [1 2 3]

a = np.array([[1., 2., 3.],
              [4., 5., 6.],
              [7., 8., 9.]])
print(a.dtype)  # float64
print(a)
# [[1. 2. 3.]
#  [4. 5. 6.]
#  [7. 8. 9.]]

# タプルから ndarray を作成する。
a = np.array((1, 2, 3))
print(a.dtype)  # int64
print(a)  # [1 2 3]

numpy.copy

指定した入力 a を deep copy して配列を作成する。
np.array(a, order=order, copy=True) と同じ。

関数

numpy.copy(a, order='K')

# shallow copy
a = np.array([[1, 2],
              [3, 4]])

b = a
b[1, 1] = 6  # shallow copy なので a の値も変わる。
print(a)
# [[1 2]
#  [3 6]]
print(b)
# [[1 2]
#  [3 6]]

# deep copy
a = np.array([[1, 2],
              [3, 4]])

b = np.copy(a)
b[1, 1] = 6  # deep copy なので a の値は変わらない。
print(a)
# [[1 2]
#  [3 4]]
print(b)
# [[1 2]
#  [3 6]]

numpy.frombuffer

指定したバッファ buffer から1次元配列を作成する。

関数

numpy.frombuffer(buffer, dtype=float, count=-1, offset=0)

# バイト列を np.uint8 として解釈し、配列を作成する。
src = b'Hello World'
a = np.frombuffer(src, dtype=np.uint8)
print(a)  # [ 72 101 108 108 111  32  87 111 114 108 100]

# バイト列を np.uint8 として解釈し、配列を作成する。
# offset から offset + count までを読み取る。
src = b'Hello World'
a = np.frombuffer(src, dtype=np.uint8, count=5, offset=6)
print(a)  # [ 97  98  99 100 101 102]

numpy.fromfile

テキストまたはバイナリファイル file から1次元配列を作成する。

  • sep='' の場合、読み込む対象はバイナリファイルと解釈される。
  • sep='' 以外の場合、読み込む対象は文字 sep 区切りで数値が記載されたテキストファイルと解釈される。

関数

numpy.fromfile(file, dtype=float, count=-1, sep='')

例: バイナリファイルから配列を作成する。

# バイト列をバイナリ形式で保存する。
src = b'abcdef'
with open('data.bin', 'wb') as f:
    f.write(src)

# ファイルオブジェクトから読み込む。
with open('data.bin', 'rb') as f:
    a = np.fromfile(f, dtype=np.uint8)
print(a)  # [ 97  98  99 100 101 102]

# ファイル名を指定して読み込む。
a = np.fromfile('data.bin', dtype=np.uint8)
print(a)  # [ 97  98  99 100 101 102]

例: テキストファイルから配列を作成する。

data.txt

1 2 3
# 配列をテキスト形式で保存する。
import csv
with open('data.txt', 'w') as f:
    writer = csv.writer(f)
    writer.writerow([1, 2, 3])

# ファイルオブジェクトから読み込む。
with open('data.txt') as f:
    a = np.fromfile(f, dtype=np.uint8, sep=',')
print(a)  # [1 2 3]

# ファイル名を指定して読み込む。
a = np.fromfile('data.txt', dtype=np.uint8, sep=',')
print(a)  # [1 2 3]

numpy.fromfunction

指定した各要素を初期化する関数 function から配列を作成する。

関数

numpy.fromfunction(function, shape, **kwargs)

# 添字を引数にとる関数で配列を作成する。
a = np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)
print(a)
# [[ True False False]
#  [False  True False]
#  [False False  True]]

numpy.fromiter

iterable オブジェクト iterable から型 dtype である1次元配列を作成する。

関数

numpy.fromiter(iterable, dtype, count=-1)

# iterable なオブジェクトを作成する。
iterable = (x * x for x in range(5))

# iterable なオブジェクトから1次元配列を作成する。
a = np.fromiter(iterable, dtype=float)
print(a)  # [ 0.  1.  4.  9. 16.]

numpy.fromstring

文字列 string から1次元配列を作成する。

関数

numpy.fromstring(string, dtype=float, count=-1, sep='')

# 空白区切りの文字列から1次元配列を作成する。
a = np.fromstring('1 2 3', dtype=int, sep=' ')
print(a)  # [1 2 3]

# カンマ区切りの文字列から1次元配列を作成する。
a = np.fromstring('1,2,3', dtype=int, sep=',')
print(a)  # [1 2 3]

numpy.loadtxt

指定したテキストファイル fname から配列を作成する。

関数

numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None,
              converters=None, skiprows=0, usecols=None, unpack=False,
              ndmin=0, encoding='bytes')
  • 引数
    • fname: ファイルオブジェクト、ファイル名、またはバイト型で文字列を返すジェネレーター。
    • dtype: 作成する配列の型。デフォルトは float。
    • comments: コメント行の先頭のマーカーとなる文字。文字または文字のリストで指定する。デフォルトは '#'。
    • delimiter: 区切り文字列。デフォルトは空白。
    • converters: 文字列を指定した型に変換する関数を指定する。
    • skiprows: スキップする先頭の行数。ヘッダーを読み飛ばす場合に使用する。
    • usecols: 読み込んだうち、一部の列のみから配列を作成する場合に、int または int のリストで列数指定する。デフォルトは0ですべての列から作成する。
    • unpack: 作成した配列を転置して返す場合は True を指定する。
    • ndmin: 作成した配列が最低 ndim=ndmin であるようにする。デフォルトは0でサイズ0の次元は省略される。
    • encoding: ファイルのエンコーディングを指定する。デフォルトは 'bytes' で laten1 としてデコードする。

例: CSV ファイルを読み込む。

from io import StringIO

text = '''col1,col2,col3
1,2,3
4,5,6
7,8,9
# comment
'''

# 'comments='#': #' から始まる行はコメントとして無視する。
# delimiter=',': 区切り文字は ',' とする。
# skiprows=1: 最初の1行はヘッダーなので無視する。
a = np.loadtxt(StringIO(text), dtype=int,
               comments='#', delimiter=',', skiprows=1)
print(a)
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

例: unpack=True の使い方

from io import StringIO

text = '''x,y,z
1 2 4
1 5 2
2 3 1
4 2 5
8 2 3
'''

a = np.loadtxt(StringIO(text), dtype=int, skiprows=1)
print(a)
# [[1 2 4]
#  [1 5 2]
#  [2 3 1]
#  [4 2 5]
#  [8 2 3]]

# unpack=True で返り値の配列が転置されるので、展開できる。
X, Y, Z = np.loadtxt(StringIO(text), dtype=int, skiprows=1, unpack=True)
print('X', X)  # X [1 1 2 4 8]
print('Y', Y)  # Y [2 5 3 2 2]
print('Z', Z)  # Z [4 2 1 5 3]

例: usecols の使い方

from io import StringIO

text = '''col1,col2,col3,col4
1 2 3 4
5 6 7 8
9 10 11 12
'''

# 2, 4列目だけ使用して配列を作成する。
a = np.loadtxt(StringIO(text), dtype=int, skiprows=1, usecols=[1, 3])
print(a)
# [[ 2  4]
#  [ 6  8]
#  [10 12]]

例: ndmin の使い方

from io import StringIO

text1 = '1'
text2 = '1 2 3'
text3 = '1 2 3\n4 5 6'

# ndmin=0 (デフォルト)
print(np.loadtxt(StringIO(text1), dtype=int))  # 1
print(np.loadtxt(StringIO(text2), dtype=int))  # [1 2 3]
print(np.loadtxt(StringIO(text3), dtype=int))
# [[1 2 3]
#  [4 5 6]]

# ndmin=1: 最低 ndim=1 となるよう配列を作成する。
print(np.loadtxt(StringIO(text1), dtype=int, ndmin=1))  # [1]

# ndmin=2: 最低 ndim=2 となるよう配列を作成する。
print(np.loadtxt(StringIO(text1), dtype=int, ndmin=2))  # [[1]]
print(np.loadtxt(StringIO(text2), dtype=int, ndmin=2))  # [[1 2 3]]

例: dtype, converters の使い方

各列ごとに型が異なる場合は dtype 引数に (列名, 型) のリストを指定する。
また、読み込んだ際に変換したい際は関数を指定することができる。
例えば、以下の例では3列目 Birthday を文字列から datetime 型に変換している。

from datetime import datetime as dt
from io import StringIO

text = '''Name,Age,Birthday
Yamada 31 1992/01/21
Tanaka 24 1986/12/22
Sato 12 1996/08/11
'''

str2date = lambda x: dt.strptime(x.decode('utf8'), '%Y/%m/%d')

a = np.loadtxt(StringIO(text),
               dtype=[('Name', 'U10'), ('Age', int), ('Birthday', dt)],
               converters={2: str2date},
               skiprows=1)
print(a)
# [('Yamada', 31, datetime.datetime(1992, 1, 21, 0, 0))
#  ('Tanaka', 24, datetime.datetime(1986, 12, 22, 0, 0))
#  ('Sato', 12, datetime.datetime(1996, 8, 11, 0, 0))]