NumPyのarray関数でリストやタプルから配列を作成する方法

np.array関数はリストやタプルなどのPythonの標準シーケンスから配列を生成する関数です。このページでは、この関数の書き方や使い方をサンプルコードを見ながら解説していきます。

使用頻度が高い関数ですので、しっかりと使い方を抑えておきましょう。

目次

1. 書式

np.array関数の書式は以下の通りです。サッと確認しておきましょう。

numpy.array

書き方:

np.array(object, dtype=None, subok=False, ndmin=0)

パラメーター:

object: array_like
リストやタプルなどのシーケンスを渡す。
dtype: data-type, optional
出力する配列のデータ型を指定する。指定しない場合は、シーケンスのオブジェクトを保持するのに必要な最小の型になる。基本的に、第一引数で渡したオブジェクトの型をそのまま引き継ぐと考えれば良い。
subok: bool, optional
Trueにした場合、第一引数で渡したオブジェクトのサブクラスを引き継ぐ。デフォルトのFalse値の場合は配列を生成する。
ndmin: int, optional
生成する配列の次元数を指定する。

戻り値: 

out: ndarray
引数で指定した通りのNumPyの配列を返す。

一緒に確認したい関数:

  • empty: 要素が空の未初期化配列を生成
  • ones: 要素が1の初期化配列を生成
  • zeros: 要素が0の初期化配列を生成
  • full: 要素が任意の値の初期化配列を生成

2. サンプルコード

それでは、早速、サンプルコードを見ながら使い方を確認していきましょう。

2.1. 1次元配列の生成

以下のコードでは、引数にリストを渡して配列を生成しています。

In [1]:
import numpy as np
#  リストから配列を生成
np.array([1, 2, 3])
Out[1]:
array([1, 2, 3])

タプルを渡しても構いません。

In [2]:
#  タプルでも可能
np.array((4, 5, 6))
Out[2]:
array([4, 5, 6])

よくある間違いに、引数にリストやタプルなどのシーケンスではなく、数値を直接渡してしまうというものがあります。その場合はエラーになりますので気をつけましょう。

In [3]:
# よくある間違い。引数に数値を渡してしまう。
np.array(1, 2, 3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-39-cdb81688cbab> in <module>
----> 2 np.array(1, 2, 3)

TypeError: array() takes from 1 to 2 positional arguments but 3 were given

2.2. 多次元配列の生成

多重シーケンスを渡した場合、生成される配列の次元数は、それに準じたものになります。2重リストを渡すと2次元配列が生成されます。

In [4]:
#  2重リストを渡すと2次元配列を生成
np.array([[1, 2, 3], [4, 5, 6]])
Out[4]:
array([[1, 2, 3],
       [4, 5, 6]])

3重リストを渡すと3次元配列が生成されます。

In [5]:
#  3重リストを渡すと3次元配列を生成
np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
Out[5]:
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

2.3. 要素の型の変更

さて、NumPyの配列では、複数の要素の型が混在することはできません。そのため例えば元のリストの要素にint型とfloat型が混在している場合、生成される配列の要素の型(dtype)はfloat型になります。

なお、NumPyの配列の要素の型については『NumPyのdtype属性の一覧と参照・指定・変更方法』で詳しく解説しています。

In [6]:
#  リストにint型・float型が混在している場合
np.array([1, 2.0, 3])
Out[6]:
array([1., 2., 3.])

元のリストの要素にint型・float型・str型が混在している場合、生成される配列の要素の型(dtype)は、str型になってしまいます。

In [7]:
#  リストにint型・float型・str型が混在している場合
np.array([1, 2.0, '3'])
Out[7]:
array(['1', '2.0', '3'], dtype='<U32')

優先順位は次の通りです。

str > complex > float > int

同じデータ型ならビット数が大きいものが優先されます。

int64 > int32 > int16 > int8

さて、このようにリストに望まぬデータ型の要素が含まれている場合、オプション引数の dtype= が役に立ちます。

In [8]:
#  dtype= で int型を指定
a = np.array([1, 2.0, '3'], dtype=int)
a
Out[8]:
array([1, 2, 3])

dtype属性を確認してみると、指定通りint型になっていることがわかります。

In [9]:
a.dtype
Out[9]:
dtype('int64')

なお、オプション引数 dtype= では、ビット数まで指定することも可能です。その際は、dtype=np.int32dtype=np.float128 と書きます。

構造化配列の生成
次のように書けば、np.array関数で構造化配列を生成することも可能です。なお、構造化配列についても、『NumPyのdtype属性の一覧と参照・指定・変更方法』で詳しく解説していますので、ぜひ一度目を通しておいてください。

>>> x = np.array([('John',180),('Mike',200)],dtype=[('name','<U4'),('height','int')])
>>> x
array([('John', 180), ('Mike', 200)],
      dtype=[('name', '<U4'), ('height', '<i8')])

>>> x['name']
array(['John', 'Mike'], dtype='<U4')

>>> x['height']
array([180, 200])

他のオプション引数について
np.array関数の使い方については、以上を覚えておけば十分です。他に オプション引数 ndmin= と、subok= がありますが 使用頻度は限られています。以下でサっと説明しますが、完璧に理解しようとする必要はありません。読み流す程度で十分でしょう。

オプション引数 ndmin の説明

生成する配列の次元数を指定

オプション引数の ndmin= を使うと、関数に渡すリストに関係なく、生成する配列の次元数を指定することができます。これは、他の配列と結合したり、配列同士の演算を行ったりする際に使う可能性があります。なお伸長された次元軸の要素数は1になります。

以下のコードでは、2重リストを渡して3次元配列を生成するように指示しています。

In [10]:
# 2重リストを渡して3次元配列を生成
a = np.array([[1, 2, 3],[4, 5, 6]], ndmin=3)
a
Out[10]:
array([[[1, 2, 3],
        [4, 5, 6]]])

shape属性を確認すると、ちゃんと3次元配列で生成されていることがわかります。

In [11]:
a.shape
Out[11]:
(1, 2, 3)

4次元も指定してみましょう。

In [12]:
# 2重リストを渡して4次元配列を生成
a = np.array([[1, 2, 3],[4, 5, 6]], ndmin=4)
a
Out[12]:
array([[[[1, 2, 3],
         [4, 5, 6]]]])

ちゃんと4次元配列で生成されています。

In [13]:
a.shape
Out[13]:
(1, 1, 2, 3)
オプション引数 subok の説明

配列のサブクラスを引き継ぐかどうかを指定

NumPyには、配列オブジェクト(ndarray)のサブクラスとしてマトリックスオブジェクト(matrix)があります。

In [13]:
>>>  #  ndarray のサブクラス matrix を作成
>>> m = np.mat('1 2; 3 4')
>>> m
matrix([[1, 2],
        [3, 4]])

>>> type(m)
numpy.matrix

オプション引数のsubokでは、このマトリックスオブジェクトをオブジェクトとして第一引数に渡した時に、サブクラスを引き継ぐかどうかを指定することができます。

まずデフォルトでは引継ぎません。

In [14]:
# subok=False(デフォルト)ではサブクラスは引き継がない
np.array(m)
Out[14]:
array([[1, 2],
       [3, 4]])

オプション引数で subok=True にすると引継ぎます。

In [15]:
# subok=Trueにするとサブクラスを引き継ぐ
np.array(m, subok=True)
Out[15]:
matrix([[1, 2],
        [3, 4]])

3. まとめ

以上のように、np.array関数は、リストやタプルからNumPyの配列を生成する関数です。よく使う関数ですので、しっかりと使い方を抑えておきましょう。

なお、同じく使用頻度が高い関数に次のものがあります。

  • empty: 未初期化配列を生成
  • ones: 要素が1の初期化配列を生成
  • zeros: 要素が0の初期化配列を生成
  • full: 要素が任意の値の初期化配列を生成

np.empty関数以外は、すべての要素が同じ値で初期化した配列を生成します。np.empty関数は要素の値がランダムの未初期化配列を生成します。要素を初期化しないので最も高速です。

これらも併せて確認しておくと良いでしょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる