web-dev-qa-db-ja.com

Numpy - 配列に行を追加

Numpy配列に行を追加する方法

配列Aがあります。

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

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

Numpy配列はリストのような 'append'メソッドを持っていない、あるいはそう思われる。

AとXがリストであれば、私は単にするでしょう:

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

同等のことを行うためのnumpythonic方法はありますか?

ありがとう、S ;-)

129

Xとは何ですか?それが2D配列の場合、どのようにしてその行を数値と比較することができますか?i < 3

OPのコメントの後にEDIT:

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

最初の要素が< 3であるAからのすべての行をXに追加します。

A = vstack((A, X[X[:,0] < 3]))

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

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

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

この質問は7年前にされているので、私が使っている最新版では派手なバージョン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]])
19
Flora PJ Li

またこれをすることができます:

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

私はより速い '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])
3
Rona

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

import numpy as py
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()を使用して、行を派手な配列に変換した後に新しい行を追加することです。しかし、より現実的な解決策はこれらの状況下でのvstackのパフォーマンスの悪さを考慮する必要があります。追加するたびに配列に対してデータ分析を実行する必要がない場合は、新しい行をPythonの行リスト(実際にはリストのリスト)にバッファし、それらをグループとしてnumpy配列に追加することをお勧めします。データ分析を行う前にvstack()を使用してください。

3
rbasham

1回の操作で構築ができるのであれば、vstack-with-fancy-indexingという回答のようなものが良いアプローチです。しかし、もしあなたの状態がより複雑であるか、あるいはあなたの行がその場でやってくるなら、あなたは配列を大きくしたいかもしれません。実際、このようなことをするための厄介な方法 - 動的に配列を大きくする - は動的にリストを大きくすることです:

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

リストはこの種のアクセスパターンに最適化されています。リスト形式では便利な派手な多次元索引はありませんが、追加している限り、行配列のリストよりもうまくいくことは困難です。

2
user2475529

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)
2
Charles Chow
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])

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