NumPyのones関数で要素が1の初期化配列を生成する方法

np.ones関数は、全ての要素が1の初期化配列を生成する関数です。このページでは、この関数の使い方について解説します。

なお、同じように要素が1の初期化配列を生成する関数に、np.ones_like関数があります。こちらは、既にある配列の形状、データ型、メモリレイアウト、サブクラスを引き継いで、要素のみを1で初期化した配列を生成します。こちらに関しては、以下のページで解説していますので、併せて確認すると良いでしょう。

それでは、np.ones関数の使い方を確認していきましょう。

目次

1. 書式

まずは、基本的な書き方から確認しましょう。

numpy.ones

書き方:

np.ones(shape, dtype=float, order='C')

パラメーター:

shape: 整数(int型) または 整数のタプル
配列のshapeを指定する。
dtype: データ型(オプション)
要素のデータ型を指定する。デフォルト値はnp.float64。
order: ’C’ か ‘F’ から選択(オプション)
多次元データのメモリレイアウトを C言語方式(行優先)か Fortran方式(列優先)から選択する。デフォルトは ‘C’。

戻り値: 

out: 配列(ndarray)
全ての要素の値が1で、指定の形状・データ型の初期化配列

一緒に確認したい関数:

  • zeros: 要素が0の初期化配列を生成
  • full: 要素が任意の値の初期化配列を生成
  • empty: 要素が空(未初期化)の配列を生成
  • ones_like: 既存の配列から要素を1で初期化した配列を生成

2. サンプルコード

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

基本的には、引数にshapeを渡すだけです。

1次元配列の生成

以下のコードでは、shape(5, )の1次元配列を生成しています。

In [1]:
import numpy as np
#  長さ5の1次元配列を生成
arr1 = np.ones(5)

#  こちらの書き方でも可能です。
arr1 = np.ones((5,))

print(arr1)
[1. 1. 1. 1. 1.]

多次元配列の生成

2次元配列や3次元配列も生成することができます。この場合、生成したい配列のshapeは必ずタプルで渡す必要があります。

In [2]:
#  2次元配列を生成
arr2 = np.ones((2, 5))
print('2次元配列: \n', arr2, '\n')

#   3次元配列を生成
arr3 = np.ones((2, 2, 5))
print('3次元配列: \n', arr3)
2次元配列: 
 [[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]] 

3次元配列: 
 [[[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]]

いずれの場合でも、デフォルトではnp.ones関数で生成する初期化配列の要素の型はfloat64です。

配列の要素の型を変更

np.ones関数の配列の要素の型をデフォルトのfloat64から変更したい場合は、オプション引数 dtype= で任意のデータ型を指定します。

なお、NumPyのデータ型の一覧や、それを指定する時の書き方等は、『NumPyのdtypeの一覧と確認・指定・変更方法』で解説していますのでご確認ください。

以下のコードでは、それぞれint型、complex型、str型を指定して配列を生成しています。

In [3]:
#  int型
arr4 = np.ones(5, dtype=int)
print('int型: \n', arr4, '\n')

#  complex型
arr5 = np.ones((5,), dtype=complex)
print('complex型: \n', arr5, '\n')

#  文字列型
arr6 = np.ones((5, ), dtype=str)
print('文字列型: \n', arr6)
int型: 
 [1 1 1 1 1] 

complex型: 
 [1.+0.j 1.+0.j 1.+0.j 1.+0.j 1.+0.j] 

文字列型: 
 ['1' '1' '1' '1' '1']

ビット数も指定することができます。

In [4]:
#  int32
arr7 = np.ones((5, ), dtype=np.int32)
print('int32: ', arr7)
print('dtype: ', arr7.dtype, '\n')

#  float8
arr8 = np.ones((5, ), dtype='float32')
print('float32: ', arr8)
print('dtype: ', arr8.dtype)
int32:  [1 1 1 1 1]
dtype:  int32 

float32:  [1. 1. 1. 1. 1.]
dtype:  float32

メモリレイアウトの変更

Pythonのコンテナのメモリレイアウトは基本的にC言語方式です。それぞれの方式の違いについては、以下のコードでご確認ください。

In [5]:
'''  C言語方式(デフォルト)  '''
arr_c = np.arange(6).reshape((2, 3), order='C')
print('C言語方式\n', arr_c, '\n')

'''  Fortran形式  '''
arr_f = np.arange(6).reshape((2, 3), order='F')
print('Fortan形式\n', arr_f)
C言語方式
 [[0 1 2]
 [3 4 5]] 

Fortan形式
 [[0 2 4]
 [1 3 5]]

このようにC言語方式では行を優先的に、Fortran方式では列を優先的に格納していきます。

もし、Fortran方式のデータを扱いたい場合は、以下のようにオプション引数 order= で変更することができます。

In [6]:
'''  Fortran方式の配列を生成する。  '''
arr9 = np.ones((2, 5), order='F')
print(arr9)
[[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]

3. まとめ

以上の通り、np.ones関数は、任意の形状・データ型・メモリレイアウトで、全ての要素が1の初期化配列を生成する関数です。

NumPyには他にも、既存の配列の形状・データ型・メモリレイアウトを引き継いで、要素のみを1で初期化した新しい配列を生成する関数として、np.ones_like関数が用意されています。

こちらも以下のページで解説しているので併せて確認しておきましょう。

また他に初期化配列を生成する関数として、以下があります。

それぞれ使い分けると良いでしょう。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる