Blog

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

Leave A Reply