2017-12-22 1 views
2

numpy 배열의 특정 행에 대한 참조를 다른 numpy 배열에 저장할 수 있습니까?ndarray의 ndarray 행에 대한 참조

저는 2D 노드 배열을 가지고 있습니다.

nn = np.array([nodes[0], nodes[3]]) 

내가 배열 nodes이 변경되지 nn의 항목을 수정하는 경우 :

nodes = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]) 

는 지금은 그 중 몇 가지를 선택하고 다른 NumPy와 배열에 대한 참조를 저장할. ndarray nnnodes에 대한 참조를 저장하는 방법이 있습니까? 참조가 basic indexing/slicing 만들 수 있습니다 경우

+1

numpy 배열로 저장해야합니까? – Tai

+1

원하는 결과에 대해 정상적인 [슬라이싱/색인 생성] (https://www.tutorialspoint.com/numpy/numpy_indexing_and_slicing.htm)이 작동하지 않습니까? – MattR

+0

마스크를 사용하여 변경할 위치를 나타 냈습니까? 'nn'에있는 모든 참조를 똑같이 변경하려면 실행 가능한 옵션이 될 수 있습니다. –

답변

2

, 당신은 view (데이터를 보유하고 있지 않습니다 배열을, 대신 다른 배열의 데이터를 의미) 수 변화가 전파 곳 초기 배열 :

>>> nn = nodes[0:4:3] # reference array for rows 0 and 3 
>>> nn[0][0] = 0 
>>> nodes 
array([[0, 2], 
     [2, 3], 
     [3, 4], 
     [4, 5], 
     [5, 6]]) 

그렇지 않으면 코드에서와 같이 원래 배열에서 복사본을 가져 오며 업데이트는 초기 배열로 전파되지 않습니다.

+0

정말 쉽습니다. 감사합니다! 그러나 특정 행을 분할하는 방법이 있습니까? –

+0

@ joe-92 실제로 있습니다. 'nodes [[0, 3]] = some_array'를 할 수 있으며, 치수가 일치하는 한 작동 할 것입니다. '[0, 3] '대신에 배열을 줄 수 있습니다. 부울 배열을'nodes [[True, False, False, True, False]] = some_array'와 같이 지정할 수도 있습니다. –

0

방법 1

먼저, = 오브젝트 DTYPE와 유료의 NumPy와 어레이를 초기화한다. (Numpy가 어떻게해서든지 딥 복사본을 생성하기 때문에 초기화시 참조를 넣을 수 없다고 생각합니다.)

그런 다음 참조를 배열에 넣습니다.

nodes = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]) 
# nn = np.array([nodes[0], nodes[1]],dtype=object) would not work 
nn = np.array([None, None], dtype=object) 
nn[0] = nodes[0] 
nn[1] = nodes[3] 
# Now do some modification. 
nn[0][1] = 100 

Output of nodes: 
array([[ 1, 100], 
     [ 2, 3], 
     [ 3, 4], 
     [ 4, 5], 
     [ 5, 6]]) 

# make it a function 
def make_ref(old_array, indeces): 
    ret = np.array([None for _ in range(len(indeces))]) 
    for i in range(len(indeces)): 
     ret[i] = old_array[indeces[i]] 
    return ret 

nn = make_ref(nodes, [0, 3]) 

2
그냥 참조 호스트 목록을 사용 NumPy와 배열에 넣을 필요가없는 경우 방법.

nn = [nodes[0], nodes[1]] 
당신은 당신이 NumPy와 배열에서 원하는 행 인덱스를 저장할 수 있습니다
+0

'np.array ([nodes [0], nodes [3]])'를 쓰면 당연히 깊은 복사를하게 될 것입니다 : 그들이 차지하는 메모리가 인접하지 않습니다. –

+0

np.array ([nodes [0], nodes [1]])는 어떻게됩니까? 이것이 연속 된 것으로 간주되는 것이 궁금합니다. @ MadPhysicist – Tai

+0

그럴 수도 있습니다. 나중에 다시 시도해보고 알려 드리겠습니다. –

1

:

>>> nn = nodes[ref] 
>>> nn 
array([[1, 2], 
     [4, 5]]) 
: 당신은 당신이 원하는 노드에 액세스하기 위해 인덱싱 표현식에서 참조를 사용할 수 있습니다

ref = np.array([0, 3]) 

nn은이 경우 원본과 연결되지 않은 딥 복사본이됩니다.nn[foo] = bar 원래 배열에 영향을 미치지 않습니다 동안, 당신은 직접 ref를 사용할 수 있습니다

>>> nodes[ref, 1] = [17, 18] 
>>> nodes 
array([[ 1, 17], 
     [ 2, 3], 
     [ 3, 4], 
     [ 4, 18], 
     [ 5, 6]]) 

다른 방법으로, ref 위해 마스크를 사용할 수 있습니다

>>> ref2 = np.zeros(nodes.shape[0], dtype=np.bool) 
>>> ref2[ref] = True 
>>> ref2 
array([ True, False, False, True, False], dtype=bool) 

당신은 거의 모두 같은 작업을 수행 할 수 있습니다 :

>>> nn2 = nodes[ref2] 
>>> nn2 
array([[1, 2], 
     [4, 5]]) 

수정 작업 :

>>> nodes[ref2, 1] = [19, 23] 
>>> nodes 
array([[ 1, 19], 
     [ 2, 3], 
     [ 3, 4], 
     [ 4, 23], 
     [ 5, 6]]) 

인덱스의 배열이 선택 내에서 특정 노드를 선택하는 것입니다 더 편리 유일한 :

>>> nodes[ref[0], 0] 
1 
+0

답변 해 주셔서 감사합니다. 그러나'nn'과'nn2'는 참으로보기에 불과합니까? 'nn.flags.owndata'와'nn2.flags.owndata'는 두 경우 모두 true입니다. –

+0

@ joe-92. 'nn'과'nn2'는 뷰가 아닙니다. 그것들은 완전히 별개의 배열이며, 원래의 세그먼트로부터 깊이 복사됩니다. –

+0

@ joe-92. 그 점을 지적 해 주셔서 감사합니다. 나는 아마 당신의 코멘트로 이끌어 낸 가난한 말씨를 고쳤다. –

0

NumPy와에서, 당신은 편집 할 수있는 배열의 뷰를 얻을 수 있습니다 . 귀하의 예제에서는이 작업을 수행 할 수 있습니다

import numpy as np 
nodes = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]) 
node_idx = np.array([0, 3]) 
nodes[node_idx] = np.array([[1, 5], [2, 5]]) 
nodes 

출력 :

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

당신은 또한 부울 배열로 교체 할 수 있습니다 : 같은 결과를

import numpy as np 
nodes = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]) 
node_mask = np.array([True, False, False, True, False]) 
nodes[node_mask] = np.array([[1, 5], [2, 5]]) 
nodes 

합니다. 물론, 이것은 당신이이 같은 마술을 할 수 있다는 것을 의미합니다 : [1, 5]3 동일 첫 번째 요소로 모든 행을 대체

import numpy as np 
nodes = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]) 
nodes[nodes[:, 0] == 3] = [1, 5] 
nodes 

합니다. 출력 :

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