箱の中身をリセットして準備完了!numpyのzeros、ones、emptyを使いこなそう

こんにちは。ゆうせいです。

前回はデータの形を決めるndimとshapeについてお話ししましたね。データの「入れ物」のサイズが分かったら、次はその中身をどうやって用意するかというステップに進みましょう。

プログラミングをしていると、これから計算結果を入れるための「空の座席」をあらかじめ確保しておきたい場面がよくあります。そんなときに便利なのが、numpyのzeros(ゼロズ)、ones(ワンズ)、そして少しクセのあるempty(エンプティ)です。

皆さんは、新しいノートを使い始めるとき、真っ白なページが並んでいるとワクワクしませんか。numpyでも、用途に合わせて真っ白な状態や、特定の数字で埋まった状態を簡単に作れるのです。

全てをゼロで初期化するzeros

まずは一番よく使われるzerosから紹介します。これは、指定した形の配列を作り、その中身をすべて 0 で埋めてくれる関数です。

学校のテストの点数を集計する前に、とりあえず全員分 0 点で初期化した表を作っておくようなイメージですね。

zerosを使うメリット

最大のメリットは、計算の邪魔をしない「安全な箱」が手に入ることです。

足し算の結果を溜めていくとき、最初が 0 であれば、そこに数字を足していくだけで正確な合計が出せますよね。もし最初から変な数字が入っていたら、計算結果がめちゃくちゃになってしまいます。

全てを1で埋め尽くすones

次に紹介するのはonesです。名前の通り、中身をすべて 1 で埋めてくれます。

「全部 0 でいいじゃないか」と思うかもしれませんが、実は 1 が並んでいると便利な場面がたくさんあります。例えば、何かの比率を計算するときの基準値にしたり、行列の掛け算で形を整えたりするときに大活躍します。

onesを数式記号でイメージする

例えば、縦に2つ、横に3つの要素を持つ、すべて 1 の配列を作りたいときは、次のように考えます。

shape = (2, 3) のとき

中身 = すべて 1

これをプログラムで実行すると、すべての引き出しに 1 が入った棚が完成します。

スピード狂のためのempty

さて、少し注意が必要なのがemptyです。英語で「空っぽ」という意味ですが、実はこれ、中身を綺麗に掃除してくれるわけではありません。

emptyは「メモリの中に残っているゴミのようなデータ」をそのままにして、箱の枠組みだけを高速で作ります。

emptyのデメリットと使い道

emptyで作った配列の中身を表示させると、 0.00000001 のような、わけのわからない数字が入っていることがあります。これは、以前に別のプログラムが使っていたデータの残骸です。

ですので、中身をそのまま使うのは絶対にやめてください!

では、なぜそんな危ないものがあるのでしょうか。それは、zerosやonesのように中身を律儀に 01 で書き換える手間を省くため、動作が非常に速いからです。「すぐに別の計算結果で中身を上書きするから、最初の中身なんて何でもいいよ!」という上級者向けの時短テクニックなのです。

三つの関数の特徴を比較

それぞれの関数の性格を、表で比較してみましょう。

関数名中身の状態処理スピードおすすめの用途
zerosすべて 0普通合計値の算出、初期化の定番
onesすべて 1普通基準値の作成、行列計算
emptyランダムなゴミデータ速いすぐに全ての値を上書きする場合

初心者のうちは、まずは安全なzerosから使い始めるのがおすすめですよ。

実際にコードを書いてみよう

それでは、これらの関数がどう動くか見てみましょう。

import numpy as np

3つの要素を持つ0の配列

zero_array = np.zeros(3)

print(zero_array)

2行2列の1の配列

one_array = np.ones((2, 2))

print(one_array)

高速だけど中身は不明な配列

empty_array = np.empty((2, 2))

print(empty_array)

出力される数値の中に、変な桁数の数字が混ざっていませんでしたか。それがemptyの正体です。

次のステップへの指針

今回の内容で、データの「下地」を作る準備が整いました。これから学習を進める上でのアドバイスです。

  1. まずはzerosを使って、計算用の配列を確保する癖をつけましょう。
  2. データの型(整数なのか小数なのか)を指定する dtype という引数についても調べてみてください。
  3. 既存の配列と同じ形で中身を 0 にしたいときは、 zeros_like というさらに便利な関数もあります。

次は、こうして作った配列の中身を、一気に書き換える方法について学んでいくと楽しいですよ。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。