2012-08-06 3 views
3

치수가 (120, 360) 인 numpy 배열이 두 개 있습니다. 배열 중 하나는 정수와 0으로 구성되며 두 번째 배열은 float으로 구성됩니다. 두 번째 배열의 값을 nans로 바꾸려면 첫 번째 배열에 정수가 있어야합니다. 이 작업을 수행하는 쉽고 효율적인 방법이 있습니까?두 numpy 배열과 insert nans를 비교하십시오.

또한 첫 번째 배열의 정수를 nans로 바꾸고 0을 1로 변경하고 싶습니다. 미리 감사드립니다.

당신은 배열에 논리적 색인으로 쉽게 달성 할 수

답변

5

,

arr2[ arr1 != 0 ] = numpy.NaN 

그러나 정수 배열 즉, NaN을 그래서 당신이 float 배열에 첫 번째 배열을 변환해야 할 것이다 지원하지 않는

arr1 = arr1.astype(float) 
arr1[arr1 != 0.0] = numpy.NaN 
arr1[arr1 == 0.0] = 1.0 
+0

감사합니다. 새 배열을 만들지 않고도 두 번째 부분에 대해 이와 비슷한 방법이 있습니까? – pter

+0

@pter : 새 배열은 어디에 생성됩니까? 당신은 여전히'arr1'과'arr2' 만 가지고 있습니다. – jmetz

+0

(물론'astype' 문은 arr1의 복사본을 만듭니다. 그러나 우리는 그것을 arr1에 다시 할당합니다.) – jmetz

2

설정 배열 : 당신은 쉽게 두 번째 배열 NA로 설정할 수 있습니다

>>> import numpy as np 
>>> x = np.array([[1,0],[0,4]], dtype=int) 
>>> y = np.array([[1.1, 2.2],[3.3, 4.4]], dtype=float) 

당신이 원하는 여기서 n, 다음과 같이 :

>>> y[x != 0] = np.nan 
>>> y 
array([[ nan, 2.2], 
     [ 3.3, nan]]) 

다음 (NaN의 정수되지 않기 때문에) 첫 번째 배열 수레로 변환하고 원하는 값 설정 : 이전에 주석으로

>>> x = x.astype(float) 
>>> x[x != 0] = np.nan 
>>> x[x == 0] = 1 
>>> x 
array([[ nan, 1.], 
     [ 1., nan]]) 
0

을 대답, 나는 ==와 수레를 비교하는 것이 좋은 생각이라고 생각하지 않으며, 일부 작업은 낭비된다고 생각합니다. 임시 배열 mask = (X != 0)을 만들고 인덱스로 사용하는 것은 어떻습니까?

>>> X = X.astype(float) 
>>> X[~mask] = np.nan 
>>> X[mask] = 1 
0

내가하는 NaN으로 값을 교체의 목적을 알 수 없지만, 대신 NumPy와의 마스크 배열을 사용하는 것이 좋습니다 (피에르의 대답에 유사하지만 NumPy와는 내장 마스크 지원을하고있다!) :

import numpy.ma 
# mask out values when there is a non-zero integer in arr1 
arr2 = numpy.ma.masked_array(arr2, mask=arr1) 
# mask out values in arr2 for non-zero integers, and set all remaining values (the zeros) to 1 
arr1 = numpy.ma(arr1, mask=(arr1 != 0)) 
arr1[~arr1.mask] = 1 

float 변환을위한 정수가 필요하지 않으며, 이로 인해 많은 numpy의 기능을 문제없이 사용할 수 있습니다. 예 : NaN을 사용하여 배열의 평균을 계산하는 것은 확실히 잘못된 생각이며 마스크 된 배열을 사용하면 문제가되지 않습니다.

관련 문제