numpyで空の配列に列を追加していきたい
numpyの配列の扱いで悩んだことがあったのでメモ。
やりたかったことは、空の配列を作って、そこに縦ベクトルをループで水平方向に追加していく、ということ。ちなみに私が学部の頃使っていたMatlabでは以下のように書けます。
# 空の配列の作成 x = [] # 縦ベクトルyをxに連結していく for n = 1 : 4 y = [n, n, n]'; % ダッシュをつけて縦ベクトルに変換 x = [x, y]; % 水平方向に連結 end x %x = 1 2 3 4 1 2 3 4 1 2 3 4
numpyでは基本的に生成したベクトルは横ベクトル扱いです。
縦ベクトルを扱いたい場合は、色々方法がありますが以下のやり方が恐らくシンプルです。
import numpy as np # 横ベクトル x1 = np.array([1,2,3]) x2 = np.array([4,5,6]) # 縦ベクトル np.c_[x1] # array([[1], [2], [3]]) np.c_[x2] array([[4], [5], [6]]) # 縦ベクトルを水平方向に連結(配列への列の追加) np.hstack([np.c_[x1], np.c_[x2]]) # array([[1, 4], [2, 5], [3, 6]])
以下は冒頭のMatlabと同じことをやろうとチャレンジした結果。
# 空の配列の作成 x = np.array([]) # 縦ベクトルyをxに連結していく for n in range(1, 5): y = np.c_[[n, n, n]] # 縦ベクトルに変換 x = np.hstack([x, y]) print(x) # ValueError: all the input arrays must have same number of dimensions
エラー返ってきました。なるほど、xとyの長さ違うからダメと・・・。
ググってみたら、同じことを考えている人がおりました。
How to add a new row to an empty numpy array – Stack Overflow
対処法は最初にyと同じ形のゼロベクトルを作ること・・・。
import numpy as np # ゼロの縦ベクトルを作成 x = np.c_[np.zeros(3)] # 縦ベクトルyをxに連結していく for n in range(1, 5): y = np.c_[[n, n, n]] x = np.hstack([x, y]) # 最初のゼロの列がいらない print(x[:, 1:]) # [[ 1. 2. 3. 4.] [ 1. 2. 3. 4.] [ 1. 2. 3. 4.]]
しかし、スマートじゃないですね・・・。そもそも最初にゼロベクトルを作るのが嫌なので、何か良い方法ないものか・・・。
This Post Has 0 Comments