Python のリストや配列に要素を追加したり間引いたり逆順にしたり

Python の list と numpy.ndarray にまつわる備忘録。扇形の内部を塗りつぶす時に使ってみようとして少しはまったので。ついでにグラフを描くときの点の間引き方などもついでに備忘録として。

必要なモジュールの import

In [1]:
import numpy as np

リストに要素を追加する

リストに要素を追加するには + が使える。

In [2]:
a = list(range(1,6))
print(a)
type(a)
[1, 2, 3, 4, 5]
Out[2]:
list

リスト a の最初に 0 を追加する例。

In [3]:
[0] + a
Out[3]:
[0, 1, 2, 3, 4, 5]

リスト a の最後に 6 を追加する例。

In [4]:
a + [6]
Out[4]:
[1, 2, 3, 4, 5, 6]

リストの各要素を2倍するつもりで,以下のように書くと,全然違う意味になる。

In [5]:
a*2
Out[5]:
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

a*2 = a + a のこと。

In [6]:
a + a
Out[6]:
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

リスト a の全ての要素を2倍するには…

In [7]:
# Python 的?な方法で全ての要素を2倍する
[2*n for n in a]
Out[7]:
[2, 4, 6, 8, 10]

配列への変換

どうしても各要素を2倍したいのなら,いっそのこと np.array() でリストから配列へ変換してしまう手もある。

In [8]:
A = np.array(a)
print(A*2)
[ 2  4  6  8 10]

配列に要素を追加する

NumPy の配列に要素を追加するには np.append() を使う。

In [9]:
b = np.arange(1, 6)
print(b)
type(b)
[1 2 3 4 5]
Out[9]:
numpy.ndarray
In [10]:
print(np.append(0, b))
[0 1 2 3 4 5]
In [11]:
print(np.append(b, 6))
[1 2 3 4 5 6]

NumPy の配列に要素を追加するつもりで,間違って + を使うと,全然違う意味になる。(各要素に数値を足してしまう。)

In [12]:
print(b + 6)
[ 7  8  9 10 11]

リストへの変換

どうしても + を使って要素を追加したいのなら,いっそのこと .tolist() で配列からリストに変換してしまう手もある。

In [13]:
b.tolist() + [6]
Out[13]:
[1, 2, 3, 4, 5, 6]

要素を間引きする(飛ばす)

データをグラフにするときなど,データ点があまりに多い場合は適宜間引いてグラフにする場合があるだろう。そんなときに,リストや配列の要素を間引きする例。

たとえば要素を2つごとに(1つ飛ばして)表示するには…

In [14]:
print(a[::2])
print(b[::2])
[1, 3, 5]
[1 3 5]

上記のような手軽な方法を知らない場合は,以下のように基本?に戻って少し回りくどいほうほうで… (私もかつては知らなかったので,こんな回りくどい方法で間引いているページがある。)

In [15]:
[a[i] for i in range(0, len(a), 2)]
Out[15]:
[1, 3, 5]

スライス

より一般的には a[start:stop:step] のようにしてリストや配列の一部を間引いて取り出すことができる。上記の a[::2]startstop を省略し,step = 2 とした例になる。

step を省略すると,step = 1 となる。

In [16]:
# 最初の2つの要素を取り出す
print(a[:2])
print(b[:2])
[1, 2]
[1 2]
In [17]:
# 最後の2つの要素を取り出す
print(a[-2:])
print(b[-2:])
[4, 5]
[4 5]

逆順に

step の値をマイナスにすると,逆順に表示する。

In [18]:
print(a[::2])
print(a[::-2])
print(b[::-2])
[1, 3, 5]
[5, 3, 1]
[5 3 1]
In [19]:
# [::-1] とすると逆順に表示
print(a[::-1])
print(b[::-1])

# 逆順にする別解
list(reversed(a))
[5, 4, 3, 2, 1]
[5 4 3 2 1]
Out[19]:
[5, 4, 3, 2, 1]