numpy.ndarrayの基礎 (zeros / ones / empty) | Python-izm

ndarrayの基礎

独自の配列オブジェクトであるndarray(N-dimensional array)は、NumPyの効率的な数値解析を実現する最も基本的なクラスです。

ndarrayの特徴

ndarrayは次のような特徴を持ちます。

  • 通常のPythonの配列とは異なり、同じ型の要素しか格納することができません。
  • 作成時に固定のサイズを持ち、サイズが変更された場合は多くのケースで新しく作成し直されます。
  • 同じ型かつ固定サイズであるため、汎用性の高いリストなどよりも大量のデータを効率的に処理することができます。
  • インデックス値での取得やスライスを利用することができます。
  • 各計算における有用なメソッドを持ちます。また多くの関数・メソッドの引数や戻り値で利用されます。

ndarrayの作成方法

ndarrayは以下のような形で作成します。

import numpy


array_like = [[1, 10, 100], [2, 20, 200]]

print('== array ==')
print(numpy.array(array_like))

print('== zeros / zeros_like ==')
print(numpy.zeros([2, 3]))
print('-------------------')
print(numpy.zeros_like(array_like))

print('== ones / ones_like ==')
print(numpy.ones([2, 3]))
print('-------------------')
print(numpy.ones_like(array_like))
== array ==
[[  1  10 100]
 [  2  20 200]]
== zeros / zeros_like ==
[[ 0.  0.  0.]
 [ 0.  0.  0.]]
-------------------
[[0 0 0]
 [0 0 0]]
== ones / ones_like ==
[[ 1.  1.  1.]
 [ 1.  1.  1.]]
-------------------
[[1 1 1]
 [1 1 1]]

numpy.arrayは配列オブジェクトを指定してndarrayを作成します。この配列オブジェクトはndarrayであったり、タプルやリストなどのシーケンスです。numpy.zerosnumpy.onesは配列の形状を指定して作成します。前者はその配列を0で、後者は1で初期化します。numpy.zeros_likenumpy.ones_likeは配列オブジェクトを指定し、その配列と同じ形状をもったndarrayを作成します。初期値は0(zeros_like)もしくは1(ones_like)です。
空のndarrayを作成する場合はnumpy.emptynumpy.empty_likeを用います。要素がまったくないわけではなく、格納される値はランダムです。

import numpy


array_like = [[1, 10, 100], [2, 20, 200]]

print('== empty / empty_like ==')
print(numpy.empty([2, 3]))
print('-------------------')
print(numpy.empty_like(array_like))
== empty / empty_like ==
[[  2.41278729e-315   2.41277662e-315   2.50032616e-315]
 [  9.44887463e-120   6.73793622e-120   1.92978148e-110]]
-------------------
[[859254326 909326647 761606706]
 [  3158577         0         0]]

標準のrangeのような形で作成する場合はnumpy.arangeを使用します。

import numpy


print(numpy.arange(10))
print(numpy.arange(10, 20, 2))
[0 1 2 3 4 5 6 7 8 9]
[10 12 14 16 18]

データ型を指定して作成する場合は以下のようにします。

import numpy


array_like = [[1, 10, 100], [2, 20, 200]]

print(numpy.array(array_like, numpy.float32))
[[   1.   10.  100.]
 [   2.   20.  200.]]

ndarrayのデータ型

NumPyで指定可能なデータ型には次のようなものがあります。

import numpy


array_like = [[0, 1, 100]]

print(numpy.array(array_like, numpy.bool_))
print(numpy.array(array_like, numpy.int_))
print(numpy.array(array_like, numpy.intc))
print(numpy.array(array_like, numpy.intp))
print(numpy.array(array_like, numpy.int8))
print(numpy.array(array_like, numpy.int16))
print(numpy.array(array_like, numpy.int32))
print(numpy.array(array_like, numpy.int64))
print(numpy.array(array_like, numpy.uint8))
print(numpy.array(array_like, numpy.uint16))
print(numpy.array(array_like, numpy.uint32))
print(numpy.array(array_like, numpy.uint64))
print(numpy.array(array_like, numpy.float_))
print(numpy.array(array_like, numpy.float16))
print(numpy.array(array_like, numpy.float32))
print(numpy.array(array_like, numpy.float64))
print(numpy.array(array_like, numpy.complex_))
print(numpy.array(array_like, numpy.complex64))
print(numpy.array(array_like, numpy.complex128))
[[False  True  True]]
[[  0   1 100]]
[[  0   1 100]]
[[  0   1 100]]
[[  0   1 100]]
[[  0   1 100]]
[[  0   1 100]]
[[  0   1 100]]
[[  0   1 100]]
[[  0   1 100]]
[[  0   1 100]]
[[  0   1 100]]
[[   0.    1.  100.]]
[[   0.    1.  100.]]
[[   0.    1.  100.]]
[[   0.    1.  100.]]
[[   0.+0.j    1.+0.j  100.+0.j]]
[[   0.+0.j    1.+0.j  100.+0.j]]
[[   0.+0.j    1.+0.j  100.+0.j]]

各データ型の範囲等は下記リンクを参照してください。
https://docs.scipy.org/doc/numpy/user/basics.types.html#array-types-and-conversions-between-types

ndarrayの属性

ndarrayの主な属性には以下のようなものがあります。

import numpy


na = numpy.array([[1, 10, 100], [2, 20, 200]])

# データ型
print('== dtype ==')
print(na.dtype)

# 全要素数
print('== size ==')
print(na.size)

# 1要素あたりのバイト数
print('== itemsize ==')
print(na.itemsize)

# 総バイト数
print('== nbytes ==')
print(na.nbytes)

# 次元数
print('== ndim ==')
print(na.ndim)

# 配列の形状
print('== shape ==')
print(na.shape)

# 次元あたりの総バイト数とバイト数と1要素あたりのバイト数
print('== strides ==')
print(na.strides)

# 実数・虚数(複素数)
print('== real / imag ==')
print(na.real)
print(na.imag)

# 配列の1次元イテレータ
print('== flat ==')
for i in na.flat:
    print(i)
== dtype ==
int32
== size ==
6
== itemsize ==
4
== nbytes ==
24
== ndim ==
2
== shape ==
(2L, 3L)
== strides ==
(12L, 4L)
== real / imag ==
[[  1  10 100]
 [  2  20 200]]
[[0 0 0]
 [0 0 0]]
== flat ==
1
10
100
2
20
200