LoginSignup
2
4

More than 5 years have passed since last update.

2. numpyの配列(備忘録)

Last updated at Posted at 2018-11-04

*作成中*

markdownよりhtmlでかいたほうが楽な気がしてきた。
勉強したことをアウトプットする、簡単にそれができるようにしたいね

はじめに

ipythonを起動する

$ ipython

numpyをimportする

In [1]: import numpy as np

配列をつくる

In [2]: x = np.array([range(x, x + 4) for x in [1, 3, 5, 7]])
In [3]: x
Out[3]:
array([[ 1,  2,  3,  4],
       [ 3,  4,  5,  6],
       [ 5,  6,  7,  8],
       [ 7,  8,  9, 10]])

numpy配列の属性

In [4]: x.ndim
Out[4]: 2

In [5]: x.shape
Out[5]: (4, 4)

In [6]: x.size
Out[6]: 16

In [7]: x.dtype
Out[7]: dtype('int64')

In [8]: x.itemsize
Out[8]: 8

In [9]: x.nbytes
Out[9]: 128

numpy配列のインデックス操作

In [10]: x[1, 2]
Out[10]: 5

In [11]: x[2]
Out[12]: array([5, 6, 7, 8])

In [13]: x[-1]
Out[13]: array([ 7,  8,  9, 10])

In [14]: x[2, -1]
Out[14]: 8

負の数も使える。

numpy配列のスライス操作

In [15]: x[:2]
Out[15]:
array([[1, 2, 3, 4],
       [3, 4, 5, 6]])

In [16]: x[2:]
Out[16]:
array([[ 5,  6,  7,  8],
       [ 7,  8,  9, 10]])

In [17]: x[2:, 1]
Out[17]: array([6, 8])

In [18]: x[2, 1:]
Out[18]: array([6, 7, 8])

In [19]: x[:, 0]
Out[19]: array([1, 3, 5, 7])

In [20]: x[0, :]
Out[20]: array([1, 2, 3, 4])

配列の中の部分列を取り出す操作。
特に重要なのは最後2つ。それぞれ、行、列を取り出す。

numpy配列のビュー

In [21]: x_sub = x[:3, :3]

In [22]: x_sub
Out[22]:
array([[1, 2, 3],
       [3, 4, 5],
       [5, 6, 7]])

In [23]: x_sub[1, 1] = 999

In [24]: x_sub
Out[24]:
array([[  1,   2,   3],
       [  3, 999,   5],
       [  5,   6,   7]])

In [25]: x
Out[25]:
array([[  1,   2,   3,   4],
       [  3, 999,   5,   6],
       [  5,   6,   7,   8],
       [  7,   8,   9,  10]])

ということで、部分列は元の列のポインタになっていることがわかる。

大きな配列の一部分だけ編集したいときは、
このように必要な部分だけ取り出す。

コピーが必要なときは以下のように。

numpy配列のコピー

In [26]: x_sub = x[:3, :3].copy()

In [27]: x_sub
Out[27]:
array([[  1,   2,   3],
       [  3, 999,   5],
       [  5,   6,   7]])

In [28]: x_sub[1, 1] = 888

In [29]: x_sub
Out[29]:
array([[  1,   2,   3],
       [  3, 888,   5],
       [  5,   6,   7]])

In [30]: x
Out[30]:
array([[  1,   2,   3,   4],
       [  3, 999,   5,   6],
       [  5,   6,   7,   8],
       [  7,   8,   9,  10]])

numpy配列の形状変更

数値の配置を変更するときに使う。例えば要素9のベクトルを3*3のベクトルにしたかったりするときに使う。

In [31]: np.arange(9)
Out[31]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])

In [32]: np.arange(9).reshape(3, 3)
Out[32]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

numpy配列の連結

複数の配列を連結する。やり方3つ。

In [33]: a = np.arange(6).reshape(2, 3)

In [34]: a
Out[34]:
array([[0, 1, 2],
       [3, 4, 5]])

In [35]: b = np.arange(6).reshape(2, 3)

In [36]: b
Out[36]:
array([[0, 1, 2],
       [3, 4, 5]])

In [37]: c = np.concatenate([a, b])

In [38]: c
Out[38]:
array([[0, 1, 2],
      [3, 4, 5],
      [0, 1, 2],
      [3, 4, 5]])
In [39]: d = np.array([91, 92, 93])

In [40]: d
Out[40]: array([91, 92, 93])

In [41]: e = np.vstack([a, d])

In [42]: e
Out[42]:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [91, 92, 93]])
In [43]: f = np.array([[99],[99]])

In [44]: f
Out[44]:
array([[99],
       [99]])

In [45]: g = np.hstack([a, f])

In [46]: g
Out[46]:
array([[ 0,  1,  2, 99],
      [ 3,  4,  5, 99]])

numpy配列の分割

複数の配列を分割する。やり方3つ。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4