Numpy-行を配列に追加


161

どうやって派手な配列に行を追加するのですか?

私は配列Aを持っています:

A = array([[0, 1, 2], [0, 2, 0]])

Xの各行の最初の要素が特定の条件を満たす場合、別の配列Xからこの配列に行を追加します。

Numpy配列には、リストのような「追加」メソッドがないため、そうです。

AとXがリストである場合、私は単に次のようにします。

for i in X:
    if i[0] < 3:
        A.append(i)

同等のものを行うnumpythonicな方法はありますか?

ありがとう、S ;-)


回答:


120

なにX?2D配列の場合、行と数値をどのように比較できますi < 3か?

OPのコメントの後の編集:

A = array([[0, 1, 2], [0, 2, 0]])
X = array([[0, 1, 2], [1, 2, 0], [2, 1, 2], [3, 2, 0]])

最初の要素の場所からAすべての行に追加します。X< 3

import numpy as np
A = np.vstack((A, X[X[:,0] < 3]))

# returns: 
array([[0, 1, 2],
       [0, 2, 0],
       [0, 1, 2],
       [1, 2, 0],
       [2, 1, 2]])

1
申し訳ありませんが良い点!各行の最初の要素が条件を満たす必要がある2D配列を想定します。それを編集します。ありがとう、S ;-)
ダレンJ.フィッツパトリック

2
@ DarrenJ.Fitzpatrickこのタイプの操作を行うことにより、既存の配列にメモリを事前に割り当てる際にNumpyが行う優れた作業に対抗することを覚えておいてくださいA。明らかにこの回答のような小さな問題の場合、これは問題ではありませんが、大きなデータの場合はさらに厄介になる可能性があります。
dtlussier

166

よくこれを行うことができます:

  newrow = [1,2,3]
  A = numpy.vstack([A, newrow])

2
@クリスなぜ廃止されたのですか?ドキュメント
Georgy

1
@Georgy正直なところ、わかりません。私はあなたと同じ答えを探していました:-)。上記のコメントを書いた理由を思い出せません。私はドキュメントでその非推奨を見たはずです。しかし、今ドキュメントを見てください...それはそうは言っていません。彼らがそれを非推奨にし、それから彼らの考えを再び変えて、それを非推奨にして削除するにはあまりに多くの人々にとってあまりにも不愉快であると決定した可能性はありますか?
クリス

32

この質問は7年前でしたので、私が使用している最新バージョンはnumpyバージョン1.13、およびpython3ですが、行列に行を追加することで同じことを行っています、2番目の引数にダブルブラケットを置くことを忘れないでください、そうしないと、寸法エラーが発生します。

ここで、マトリックスAを追加します

1 2 3
4 5 6

行あり

7 8 9

同じ使用法 np.r_

A= [[1, 2, 3], [4, 5, 6]]
np.append(A, [[7, 8, 9]], axis=0)

    >> array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
#or 
np.r_[A,[[7,8,9]]]

列を追加したい場合は、誰かが興味を持って、

array = np.c_[A,np.zeros(#A's row size)]

前にマトリックスAで行った方法に従って、列を追加します

np.c_[A, [2,8]]

>> array([[1, 2, 3, 2],
          [4, 5, 6, 8]])

10

これを行うこともできます:

newrow = [1,2,3]
A = numpy.concatenate((A,newrow))

2
うーん。これを試したところ、OPが要求したとおりに新しい行を追加するのではなく、Aの末尾に追加されました。
Todd Curry

13
たぶんnp.concatenate((A,newrow), axis=0)
Konstantinos Roditakis 2014

3
numpyバージョン1.12.1(およびPython 3)では、ベクトルをマトリックスraisesに連結しようとするようValueError: all the input arrays must have same number of dimensionsです。それはそれを連結する前に、ベクトルを列または行ベクトルに明示的に再形成したいようです。
MRule

3
@MRuleは、@ Flora PJ Li stackoverflow.com/a/47845065/1410035からの回答に従って二重角括弧を使用することで修正できます。 newrow = [[1,2,3]]
トムサリーバ2018年

10

すべての行の後に計算が必要ない場合は、Pythonで行を追加してからnumpyに変換する方がはるかに高速です。python 3.6とnumpy 1.14を使用したタイミングテストで、100行ずつ追加します。

import numpy as np 
from time import perf_counter, sleep

def time_it():
    # Compare performance of two methods for adding rows to numpy array
    py_array = [[0, 1, 2], [0, 2, 0]]
    py_row = [4, 5, 6]
    numpy_array = np.array(py_array)
    numpy_row = np.array([4,5,6])
    n_loops = 100

    start_clock = perf_counter()
    for count in range(0, n_loops):
       numpy_array = np.vstack([numpy_array, numpy_row]) # 5.8 micros
    duration = perf_counter() - start_clock
    print('numpy 1.14 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))

    start_clock = perf_counter()
    for count in range(0, n_loops):
        py_array.append(py_row) # .15 micros
    numpy_array = np.array(py_array) # 43.9 micros       
    duration = perf_counter() - start_clock
    print('python 3.6 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
    sleep(15)

#time_it() prints:

numpy 1.14 takes 5.971 micros per row
python 3.6 takes 0.694 micros per row

したがって、7年前の元の質問に対する簡単な解決策は、vstack()を使用して、行をnumpy配列に変換した後で新しい行を追加することです。しかし、より現実的なソリューションでは、これらの状況でのvstackのパフォーマンスの低下を考慮する必要があります。追加のたびに配列でデータ分析を実行する必要がない場合は、新しい行をpythonの行のリスト(実際にはリストのリスト)にバッファーし、それらをグループとしてnumpy配列に追加することをお勧めしますデータ分析を行う前にvstack()を使用します。


5
import numpy as np
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])

array_ = np.concatenate((array_, add_row), axis=0)

3

1回の操作で作成できる場合は、vstack-with-fancy-indexingの回答のようなものが適切なアプローチです。ただし、条件がより複雑であるか、行がその場で入ってくる場合は、配列を大きくすることをお勧めします。実際、このようなことを行うnumpythonicの方法-配列を動的に拡張する-は、リストを動的に拡張することです。

A = np.array([[1,2,3],[4,5,6]])
Alist = [r for r in A]
for i in range(100):
    newrow = np.arange(3)+i
    if i%5:
        Alist.append(newrow)
A = np.array(Alist)
del Alist

リストは、この種のアクセスパターン用に高度に最適化されています。リスト形式では便利な多機能の多次元インデックス付けはありませんが、追加している限り、行配列のリストよりも優れた操作を行うことは困難です。


3

私はより高速な「np.vstack」を使用しています、EX:

import numpy as np

input_array=np.array([1,2,3])
new_row= np.array([4,5,6])

new_array=np.vstack([input_array, new_row])

2

を使用numpy.append()して、numpty配列に行を追加し、後で行列に再形成できます。

import numpy as np
a = np.array([1,2])
a = np.append(a, [3,4])
print a
# [1,2,3,4]
# in your example
A = [1,2]
for row in X:
    A = np.append(A, row)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.