[python] NumPy 배열에 추가 열을 추가하는 방법

NumPy 배열이 있다고 가정 해 보겠습니다 a.

a = np.array([
    [1, 2, 3],
    [2, 3, 4]
    ])

그리고 배열을 얻기 위해 0의 열을 추가하고 싶습니다 b.

b = np.array([
    [1, 2, 3, 0],
    [2, 3, 4, 0]
    ])

NumPy에서 어떻게 쉽게 할 수 있습니까?



답변

보다 간단한 해결책과 부팅 속도가 더 빠르다고 생각합니다.

import numpy as np
N = 10
a = np.random.rand(N,N)
b = np.zeros((N,N+1))
b[:,:-1] = a

그리고 타이밍 :

In [23]: N = 10

In [24]: a = np.random.rand(N,N)

In [25]: %timeit b = np.hstack((a,np.zeros((a.shape[0],1))))
10000 loops, best of 3: 19.6 us per loop

In [27]: %timeit b = np.zeros((a.shape[0],a.shape[1]+1)); b[:,:-1] = a
100000 loops, best of 3: 5.62 us per loop


답변

np.r_[ ... ]np.c_[ ... ]
유용한 대안이다 vstackhstack대괄호 [] 대신에 라운드 ()와 함께,.
몇 가지 예 :

: import numpy as np
: N = 3
: A = np.eye(N)

: np.c_[ A, np.ones(N) ]              # add a column
array([[ 1.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  1.],
       [ 0.,  0.,  1.,  1.]])

: np.c_[ np.ones(N), A, np.ones(N) ]  # or two
array([[ 1.,  1.,  0.,  0.,  1.],
       [ 1.,  0.,  1.,  0.,  1.],
       [ 1.,  0.,  0.,  1.,  1.]])

: np.r_[ A, [A[1]] ]              # add a row
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 0.,  1.,  0.]])
: # not np.r_[ A, A[1] ]

: np.r_[ A[0], 1, 2, 3, A[1] ]    # mix vecs and scalars
  array([ 1.,  0.,  0.,  1.,  2.,  3.,  0.,  1.,  0.])

: np.r_[ A[0], [1, 2, 3], A[1] ]  # lists
  array([ 1.,  0.,  0.,  1.,  2.,  3.,  0.,  1.,  0.])

: np.r_[ A[0], (1, 2, 3), A[1] ]  # tuples
  array([ 1.,  0.,  0.,  1.,  2.,  3.,  0.,  1.,  0.])

: np.r_[ A[0], 1:4, A[1] ]        # same, 1:4 == arange(1,4) == 1,2,3
  array([ 1.,  0.,  0.,  1.,  2.,  3.,  0.,  1.,  0.])

(둥근 () 대신 대괄호 []의 이유는 파이썬이 예를 들어 사각형에서 1 : 4로 확장되기 때문입니다. 오버로드의 경이로움)


답변

사용 numpy.append:

>>> a = np.array([[1,2,3],[2,3,4]])
>>> a
array([[1, 2, 3],
       [2, 3, 4]])

>>> z = np.zeros((2,1), dtype=int64)
>>> z
array([[0],
       [0]])

>>> np.append(a, z, axis=1)
array([[1, 2, 3, 0],
       [2, 3, 4, 0]])


답변

hstack을 사용하는 한 가지 방법 은 다음과 같습니다.

b = np.hstack((a, np.zeros((a.shape[0], 1), dtype=a.dtype)))


답변

나는 다음과 같은 가장 우아한 것을 발견했다.

b = np.insert(a, 3, values=0, axis=1) # Insert values before column 3

장점은 insert배열 내의 다른 위치에 열 (또는 행)을 삽입 할 수 있다는 것입니다. 또한 단일 값을 삽입하는 대신 전체 열을 쉽게 삽입 할 수 있습니다 (예 : 마지막 열 복제).

b = np.insert(a, insert_index, values=a[:,2], axis=1)

어느 것이나

array([[1, 2, 3, 3],
       [2, 3, 4, 4]])

타이밍 insert의 경우 JoshAdel의 솔루션보다 느릴 수 있습니다.

In [1]: N = 10

In [2]: a = np.random.rand(N,N)

In [3]: %timeit b = np.hstack((a, np.zeros((a.shape[0], 1))))
100000 loops, best of 3: 7.5 µs per loop

In [4]: %timeit b = np.zeros((a.shape[0], a.shape[1]+1)); b[:,:-1] = a
100000 loops, best of 3: 2.17 µs per loop

In [5]: %timeit b = np.insert(a, 3, values=0, axis=1)
100000 loops, best of 3: 10.2 µs per loop


답변

나는 또한이 질문에 관심이 있었고 속도를 비교했습니다.

numpy.c_[a, a]
numpy.stack([a, a]).T
numpy.vstack([a, a]).T
numpy.ascontiguousarray(numpy.stack([a, a]).T)               
numpy.ascontiguousarray(numpy.vstack([a, a]).T)
numpy.column_stack([a, a])
numpy.concatenate([a[:,None], a[:,None]], axis=1)
numpy.concatenate([a[None], a[None]], axis=0).T

입력 벡터에 대해 모두 동일한 작업을 수행합니다 a. 성장 타이밍 a:

여기에 이미지 설명을 입력하십시오

모든 비 연속 변형 (특히 stack/ vstack)은 결국 모든 연속 변형보다 빠릅니다. column_stack(명확성과 속도를 위해) 연속성이 필요한 경우 좋은 옵션으로 보입니다.


줄거리를 재현하는 코드 :

import numpy
import perfplot

perfplot.save(
    "out.png",
    setup=lambda n: numpy.random.rand(n),
    kernels=[
        lambda a: numpy.c_[a, a],
        lambda a: numpy.ascontiguousarray(numpy.stack([a, a]).T),
        lambda a: numpy.ascontiguousarray(numpy.vstack([a, a]).T),
        lambda a: numpy.column_stack([a, a]),
        lambda a: numpy.concatenate([a[:, None], a[:, None]], axis=1),
        lambda a: numpy.ascontiguousarray(
            numpy.concatenate([a[None], a[None]], axis=0).T
        ),
        lambda a: numpy.stack([a, a]).T,
        lambda a: numpy.vstack([a, a]).T,
        lambda a: numpy.concatenate([a[None], a[None]], axis=0).T,
    ],
    labels=[
        "c_",
        "ascont(stack)",
        "ascont(vstack)",
        "column_stack",
        "concat",
        "ascont(concat)",
        "stack (non-cont)",
        "vstack (non-cont)",
        "concat (non-cont)",
    ],
    n_range=[2 ** k for k in range(20)],
    xlabel="len(a)",
    logx=True,
    logy=True,
)


답변

나는 생각한다 :

np.column_stack((a, zeros(shape(a)[0])))

더 우아합니다.