Numpy-배열에 행 추가


161

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)

동등한 작업을 수행 하는 수많은 방법이 있습니까?

고마워, 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 ;-)
Darren J. Fitzpatrick

2
@ DarrenJ.Fitzpatrick이 유형의 조작을 수행하면 Numpy가 기존 어레이의 메모리를 사전 할당하는 좋은 작업에 반하는 작업을 수행 할 수 있습니다 A. 분명히이 답변과 같은 작은 문제의 경우 이것은 문제가되지 않지만 큰 데이터의 경우 더 문제가 될 수 있습니다.
dtlussier

166

잘 당신은 이것을 할 수 있습니다 :

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

2
@Kris 왜 더 이상 사용되지 않습니까? 나는 문서
Georgy

1
@Georgy 솔직히 말해서 모르겠다. 나는 너와 같은 대답을 찾고 있었다 :-). 왜 내가 위의 의견을 썼는지 기억이 안납니다. 문서에서 더 이상 사용되지 않는 것을 보았을 것입니다. 그러나 지금 문서를 보면 ... 그렇게 말하지 않습니다. 그들이 그것을 더 이상 사용하지 않겠다고 생각했다가 다시 마음을 바꾸었고 너무 많은 사람들이 그것을 사용하지 않고 제거하기에는 너무 성 가실 것이라고 결정했을까요?
Kris

32

이 질문은 7 년 전부터 사용하고있는 최신 버전에서 numpy 버전 1.13이며 python3에서는 행렬에 행을 추가하는 것과 동일한 일을하고 있습니다. 더블 괄호를 사용해야합니다. 을하고 있습니다. 두 번째 인수 를 . 그렇지 않으면 치수 오류가 발생합니다.

여기에 행렬 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]])

11

매 행마다 계산이 필요하지 않으면 파이썬에서 행을 추가하고 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 년 전의 원래 질문에 대한 간단한 해결책은 행을 numpy 배열로 변환 한 후 vstack ()을 사용하여 새 행을 추가하는 것입니다. 그러나보다 현실적인 솔루션은 이러한 환경에서 vstack의 성능 저하를 고려해야합니다. 추가 할 때마다 배열에서 데이터 분석을 실행할 필요가 없으면 새 행을 파이썬 행 목록 (실제로 목록)에 버퍼링하고 numpy 배열에 그룹으로 추가하는 것이 좋습니다 데이터 분석을 수행하기 전에 vstack () 사용.


10

당신은 또한 이것을 할 수 있습니다 :

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

2
흠. 이것을 시도했을 때 OP가 요청 한대로 새 행을 추가하는 대신 A 끝에 추가했습니다.
토드 카레

13
아마np.concatenate((A,newrow), axis=0)
Konstantinos Roditakis

3
numpy 버전 1.12.1(및 Python 3)에서 벡터를 행렬에 연결하려고 시도하는 것처럼 보입니다 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]]
Tom Saleeba

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

단일 작업으로 구성을 수행 할 수 있다면 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

목록은 이러한 종류의 액세스 패턴에 매우 적합합니다. 목록 형식으로 편리한 수 많은 다차원 인덱싱이 없지만 추가하는 한 행 배열 목록보다 더 잘 수행하기가 어렵습니다.


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.