2016-07-07 2 views
2

다른 차원의 2 개의 numpy 배열이 있습니다. ,2 개의 numpy 어레이를 비교하고 누락 된 값을 다른 것으로 수정하는 방법

A = [2,4] I는 작은 배열 만 0 번째 요소 1 요소가 0 예컨대

으로 제공되어야로 큰 배열의 이러한 추가 요소를 추가 할 [4,5], [8,9], [7,5]

B = [2,5], [4,6]

누락 요소를 추가 한 후을 b, B

b [2,5], [4,6], [8,0], [7,0]]

나는 어느 정도까지 논리를 시험해 보았지만, 그 값이 이미 b에 추가되었는지 여부를 확인할 수 없기 때문에 일부 값이 중복되어 추가되었습니다.

둘째, 나는 b의 사본 인 추가 배열 c의 도움으로이를 수행하고 c에 원하는 작업을 수행합니다. 만약 누군가가 제 3의 배열 c없이 그것을하는 방법을 보여줄 수 있다면, 매우 도움이 될 것입니다.

import numpy as np 

a = [[2,3],[4,5],[6,8], [9,6]] 

b = [[2,3],[4,5]] 

a = np.array(a) 
b = np.array(b) 
c = np.array(b) 

for i in range(len(b)): 
    for j in range(len(a)): 
     if a[j,0] == b[i,0]: 
      print "matched " 
     else: 
      print "not matched" 
      c= np.insert(c, len(c), [a[j,0], 0], axis = 0) 
print c 
+0

빠른 제안은 올바른 크기의 타겟 배열을 만들고, 오른쪽 슬롯에 'b'와 다른 조각들을 복사하는 것입니다. 'concatenate','stack' 그리고'insert'는 모두 그 동작의 어떤 형태를 어쨌든합니다. – hpaulj

답변

2
#####For explanation##### 
#basic set operation to get the missing elements 
c = set([i[0] for i in a]) - set([i[0] for i in b]) 
#c will just store the missing elements.... 
#then just append the elements 
for i in c: 
    b.append([i, 0]) 

출력 -

[[2, 5], [4, 6], [8, 0], [7, 0]] 

편집 -

그러나 그들은 NumPy와 방금이 작업을 수행 할 수 배열 (그리고 중간으로 C를 사용하지 않고) 그대로 - 두 줄

for i in set(a[:, 0]) - (set(b[:, 0])): 
    b = np.append(b, [[i, 0]], axis = 0) 

출력 -

array([[2, 5], 
     [4, 6], 
     [8, 0], 
     [7, 0]]) 
1

당신은 a에서 행을 선택하거나 0으로 설정 마스크를 얻고 마스크를 기반으로하는 ab에서 일치하는 행을 찾기 위해 np.in1d를 사용할 수 있습니다. 아래 그림과 같이 따라서, 우리는 벡터화 된 접근 방식을 것이다 - 우리가 하나의 오해를 정리해야

In [47]: a 
Out[47]: 
array([[2, 4], 
     [4, 5], 
     [8, 9], 
     [7, 5]]) 

In [48]: b 
Out[48]: 
array([[8, 7], 
     [4, 6]]) 

In [49]: np.vstack((b,a[~np.in1d(a[:,0],b[:,0])]*[1,0])) 
Out[49]: 
array([[8, 7], 
     [4, 6], 
     [2, 0], 
     [7, 0]]) 
1

첫째 -

np.vstack((b,a[~np.in1d(a[:,0],b[:,0])]*[1,0])) 

샘플 실행됩니다. ccopy 일 필요는 없습니다. 새로운 변수 할당이면 충분합니다.

c = b 
... 
    c= np.insert(c, len(c), [a[j,0], 0], axis = 0) 

np.insert은 입력을 수정하지 않습니다. 오히려 그것은 새로운 배열을 만듭니다. c=...은 원래 할당을 대체하여 c에 할당합니다. 따라서 원래의 c 할당은 단지 반복을 쉽게 작성하게 만듭니다.

당신이 마지막에 새로운 [a[j,0],0]를 추가하고 있기 때문에, 당신은 CONCATENATE (insertstack(s)에서 사용하는 기본 기능을 사용할 수 있습니다. 실행 시간의 변화를 많이하지 않습니다

c = np.concatenate((c, [a[j,0],0]), axis=0) 

합니다.a[j]을 모두 한 번에 추가하는 것이 좋습니다.

이 경우 a[2,0]a[3,0]을 추가하려고합니다.

In [595]: a=np.array([[2,3],[4,5],[6,8],[9,6]]) 
In [596]: b=np.array([[2,3],[4,5]]) 
In [597]: ind = [2,3] 

할당과 같은 접근 방식이 보일 것이다 채우기 : 순간, 옆으로 떠나, 우리가 찾는 방법의 질문은 [2,3], 우리가 할 수있는

In [605]: c = np.zeros_like(a) # target array 
In [607]: c[0:b.shape[0],:] = b  # fill in the b values 
In [608]: c[b.shape[0]:,0] = a[ind,0] # fill in the selected a column 

In [609]: c 
Out[609]: 
array([[2, 3], 
     [4, 5], 
     [6, 0], 
     [9, 0]]) 

변형이 될 것이다 새로운 a 값을 임시 배열을 구성하고, 나는 a1 만들고 내가 콘카하는 방법을 알아낼 너무 게으른이기 때문에 접근을 채우기 사용하고

In [613]: a1 = np.zeros((len(ind),2),a.dtype) 
In [614]: a1[:,0] = a[ind,0] 
In [616]: np.concatenate((b,a1),axis=0) 
Out[616]: 
array([[2, 3], 
     [4, 5], 
     [6, 0], 
     [9, 0]]) 

을 연결 tenate a[ind,0] 같은 것을 만들기에 충분한 0s. Divakar 보듯이 :)

np.in1d는 경기

In [617]: np.in1d(a[:,0],b[:,0]) 
Out[617]: array([ True, True, False, False], dtype=bool) 

In [618]: np.nonzero(~np.in1d(a[:,0],b[:,0])) 
Out[618]: (array([2, 3], dtype=int32),) 

In [619]: np.nonzero(~np.in1d(a[:,0],b[:,0]))[0] 
Out[619]: array([2, 3], dtype=int32) 

In [620]: ind=np.nonzero(~np.in1d(a[:,0],b[:,0]))[0] 

당신은 또한 (값이 정렬됩니다) np.setdiff1d(a[:,0],b[:,0])으로 입수 할 수있는 순서 a[ind,0] 신경 쓰지 않는 경우

을 찾는 편리한 방법입니다.

관련 문제