2017-12-19 1 views
3

foon 행이고 ​​행은 m입니다. 예 :지정된 열이있는 각 행에 대해 numpy 배열에 값 할당

>>> import numpy as np 
>>> foo = np.arange(6).reshape(3, 2) # n=3 and m=2 in our example 
>>> print(foo) 
array([[0, 1], 
     [2, 3], 
     [4, 5]]) 

n 요소 배열 bar있다. 예 :

>>> bar = np.array([9, 8, 7]) 

나는 열 인덱스를 포함 길이 n의 목록 ind 있습니다. 예 :

>>> ind = np.array([0, 0, 1], dtype='i') 

I 행렬 foobar에 값을 할당하는 열 인덱스 ind를 사용하려는 것이다. 나는 이것을 행마다하고 싶다. 이 작업을 수행 할 수있는 파이썬 방법은

>>> assign_function(ind, bar, foo) 
>>> print(foo) 
array([[9, 1], 
     [8, 3], 
     [4, 7]]) 

거기에 다음과 같이이이 assign_function라고 않는 기능은, 내 출력을 볼 것이라고 가정?

+1

'foo는 [np.arange -

foo[ind[:,None] == range(foo.shape[1])] = bar 

샘플 단계별 실행

(foo)), ind] = bar'입니까? –

+0

시작하려면, 얻으려는 결과가 정의 된 변수와 일치하지 않습니다. 맞습니까? –

+0

질문에 대한 답변을 얻으려면 [투표에 동의하고 가장 도움이되는 질문에 동의하십시오] (https://meta.stackexchange.com/a/5235)를 클릭하십시오. 감사. –

답변

3

ind이 첫 번째 축을 처리하므로 0 번째 축에 대한 인덱서가 필요합니다. 당신은 np.arange 꽤 간단하게이 작업을 수행 할 수 있습니다

foo[np.arange(len(foo)), ind] = bar 
foo 

array([[9, 1], 
     [8, 3], 
     [4, 7]]) 
2

가 활용 broadcastingmasking alongwith - LEN (

# Input array 
In [118]: foo 
Out[118]: 
array([[0, 1], 
     [2, 3], 
     [4, 5]]) 

# Mask of places to be assigned 
In [119]: ind[:,None] == range(foo.shape[1]) 
Out[119]: 
array([[ True, False], 
     [ True, False], 
     [False, True]], dtype=bool) 

# Assign values off bar 
In [120]: foo[ind[:,None] == range(foo.shape[1])] = bar 

# Verify 
In [121]: foo 
Out[121]: 
array([[9, 1], 
     [8, 3], 
     [4, 7]]) 
+1

좋은 하나! 나는 이것을 좋아한다. 팬더에 관한 많은 질문에 방송을 사용합니다. –