numpy 배열을 2차원으로 확장하는 가장 간단한 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/877479

  •  22-08-2019
  •  | 
  •  

문제

다음과 같은 2D 배열이 있습니다.

XX
xx

추가 행과 열을 추가하는 가장 효율적인 방법은 무엇입니까?

xxy
xxy
yyy

보너스 포인트의 경우 단일 행과 열을 제거할 수도 있기를 원합니다. 예를 들어 아래 행렬에서 x만 남기고 모든 a를 제거할 수 있기를 원합니다. 특히 저는 n번째 행과 n번째 열을 동시에 삭제하려고 합니다. 가능한 한 빨리 이 작업을 수행할 수 있기를 원합니다.

xxaxx
xxaxx
aaaaa
xxaxx
xxaxx
도움이 되었습니까?

해결책

내가 생각할 수있는 코드 라인 측면에서 가장 짧은 것은 첫 번째 질문입니다.

>>> import numpy as np
>>> p = np.array([[1,2],[3,4]])

>>> p = np.append(p, [[5,6]], 0)
>>> p = np.append(p, [[7],[8],[9]],1)

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

그리고 두 번째 질문에 대한

    p = np.array(range(20))
>>> p.shape = (4,5)
>>> p
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
>>> n = 2
>>> p = np.append(p[:n],p[n+1:],0)
>>> p = np.append(p[...,:n],p[...,n+1:],1)
>>> p
array([[ 0,  1,  3,  4],
       [ 5,  6,  8,  9],
       [15, 16, 18, 19]])

다른 팁

첫 번째 질문에 대한 유용한 대안 답변(예제 사용) 토미디의 대답은 numpy를 사용하는 것입니다 대스택 그리고 컬럼_스택 행동 양식:

행렬 p가 주어지면,

>>> import numpy as np
>>> p = np.array([ [1,2] , [3,4] ])

증강 행렬은 다음을 통해 생성될 수 있습니다.

>>> p = np.vstack( [ p , [5 , 6] ] )
>>> p = np.column_stack( [ p , [ 7 , 8 , 9 ] ] )
>>> p
array([[1, 2, 7],
       [3, 4, 8],
       [5, 6, 9]])

이러한 메서드는 다음 시나리오와 달리 수정 없이 1D 배열을 행렬에 추가할 수 있으므로 실제로 np.append()보다 편리할 수 있습니다.

>>> p = np.array([ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ] )
>>> p = np.append( p , [ 7 , 8 , 9 ] , 1 )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/dist-packages/numpy/lib/function_base.py", line 3234, in append
    return concatenate((arr, values), axis=axis)
ValueError: arrays must have same number of dimensions

두 번째 질문에 대한 대답으로, 행과 열을 제거하는 좋은 방법은 다음과 같이 논리 배열 인덱싱을 사용하는 것입니다.

행렬 p가 주어지면,

>>> p = np.arange( 20 ).reshape( ( 4 , 5 ) )

행 1과 열 2를 제거한다고 가정합니다.

>>> r , c = 1 , 2
>>> p = p [ np.arange( p.shape[0] ) != r , : ] 
>>> p = p [ : , np.arange( p.shape[1] ) != c ]
>>> p
array([[ 0,  1,  3,  4],
       [10, 11, 13, 14],
       [15, 16, 18, 19]])

참고 - 개편된 Matlab 사용자의 경우 - 한 줄로 이 작업을 수행하려면 두 번 색인을 생성해야 합니다.

>>> p = np.arange( 20 ).reshape( ( 4 , 5 ) )    
>>> p = p [ np.arange( p.shape[0] ) != r , : ] [ : , np.arange( p.shape[1] ) != c ]

이 기술을 확장하여 제거할 수도 있습니다. 세트 행과 열이 있으므로 행 0과 2, 열 1, 2, 3을 제거하려면 numpy를 사용할 수 있습니다. setdiff1d 원하는 논리 인덱스를 생성하는 함수:

>>> p = np.arange( 20 ).reshape( ( 4 , 5 ) )
>>> r = [ 0 , 2 ]
>>> c = [ 1 , 2 , 3 ]
>>> p = p [ np.setdiff1d( np.arange( p.shape[0] ), r ) , : ] 
>>> p = p [ : , np.setdiff1d( np.arange( p.shape[1] ) , c ) ]
>>> p
array([[ 5,  9],
       [15, 19]])

또 다른 우아한 솔루션 첫 번째 질문 일 수 있습니다 insert 명령:

p = np.array([[1,2],[3,4]])
p = np.insert(p, 2, values=0, axis=1) # insert values before column 2

으로 이끌다:

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

insert 보다 느릴 수 있습니다 append 그러나 전체 행/열을 하나의 값으로 쉽게 채울 수 있습니다.

에 관해서 두 번째 질문, delete 이전에 제안되었습니다 :

p = np.delete(p, 2, axis=1)

원래 배열을 다시 복원합니다.

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

더 큰 행렬에서 할당을 통해 "확장"하는 것이 훨씬 쉽다는 것을 알게됩니다. 예를 들어

import numpy as np
p = np.array([[1,2], [3,4]])
g = np.array(range(20))
g.shape = (4,5)
g[0:2, 0:2] = p

배열은 다음과 같습니다.

p

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

g:

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

그리고 결과 g 과제 후 :

   array([[ 1,  2,  2,  3,  4],
       [ 3,  4,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

첫 번째 질문에 대한 답변 :

Numpy.Append를 사용하십시오.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.append.html#numpy.append

두 번째 질문에 대한 답변 :

numpy.delete를 사용하십시오

http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html

당신이 사용할 수있는:

>>> np.concatenate([array1, array2, ...]) 

예를 들어

>>> import numpy as np
>>> a = [[1, 2, 3],[10, 20, 30]]
>>> b = [[100,200,300]]
>>> a = np.array(a) # not necessary, but numpy objects prefered to built-in
>>> b = np.array(b) # "^
>>> a
array([[ 1,  2,  3],
       [10, 20, 30]])
>>> b
array([[100, 200, 300]])
>>> c = np.concatenate([a,b])
>>> c
array([[  1,   2,   3],
       [ 10,  20,  30],
       [100, 200, 300]])
>>> print c
[[  1   2   3]
 [ 10  20  30]
 [100 200 300]]

~-+-~-+-~-+-~

때로는 Numpy Array 객체가 모양 속성에 대한 불완전한 값으로 초기화되면 문제가 발생합니다. 이 문제는 모양 속성에 튜플에 할당하여 고정됩니다.

참고 : 여기서, 'array_length'및 'element_length'는 정수 매개 변수이며 값을 대체합니다. '튜플'은 괄호 안의 한 쌍일뿐입니다.

예를 들어

>>> import numpy as np
>>> a = np.array([[1,2,3],[10,20,30]])
>>> b = np.array([100,200,300]) # initialize b with incorrect dimensions
>>> a.shape
(2, 3)
>>> b.shape
(3,)
>>> c = np.concatenate([a,b])

Traceback (most recent call last):
  File "<pyshell#191>", line 1, in <module>
    c = np.concatenate([a,b])
ValueError: all the input arrays must have same number of dimensions
>>> b.shape = (1,3)
>>> c = np.concatenate([a,b])
>>> c
array([[  1,   2,   3],
       [ 10,  20,  30],
       [100, 200, 300]])

어쩌면 당신은 이것을 필요로합니다.

>>> x = np.array([11,22])
>>> y = np.array([18,7,6])
>>> z = np.array([1,3,5])
>>> np.concatenate((x,y,z))
array([11, 22, 18,  7,  6,  1,  3,  5])
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top