NumPy 배열을 특정 범위 내로 정규화하는 방법은 무엇입니까?
오디오 또는 이미지 배열에서 일부 처리를 수행 한 후에는 파일로 다시 쓰기 전에 범위 내에서 정규화해야합니다. 다음과 같이 할 수 있습니다 :
# Normalize audio channels to between -1.0 and +1.0
audio[:,0] = audio[:,0]/abs(audio[:,0]).max()
audio[:,1] = audio[:,1]/abs(audio[:,1]).max()
# Normalize image to between 0 and 255
image = image/(image.max()/255.0)
덜 장황하고 편리한 기능 방법이 있습니까? matplotlib.colors.Normalize()
관련이없는 것 같습니다.
audio /= np.max(np.abs(audio),axis=0)
image *= (255.0/image.max())
사용 /=
및 *=
따라서 일부 메모리를 저장, 당신은 중간 임시 배열을 제거 할 수 있습니다. 곱셈은 나눗셈보다 비싸지 않으므로
image *= 255.0/image.max() # Uses 1 division and image.size multiplications
보다 약간 빠르다
image /= image.max()/255.0 # Uses 1+image.size divisions
여기서는 기본적인 numpy 메소드를 사용하고 있기 때문에 이것이 가능한 한 numpy의 효율적인 솔루션이라고 생각합니다.
전체 작업은 컨테이너 배열의 dtype을 변경하지 않습니다. 원하는 정규화 된 값은 부동 소수점이므로 in-place 연산을 수행하기 전에 audio
및 image
배열에 부동 소수점 dtype이 있어야합니다. 아직 부동 소수점 dtype이 아닌 경우을 사용하여 변환해야합니다 astype
. 예를 들어
image = image.astype('float64')
배열에 양수 데이터와 음수 데이터가 모두 포함되어 있으면 다음을 수행하십시오.
import numpy as np
a = np.random.rand(3,2)
# Normalised [0,1]
b = (a - np.min(a))/np.ptp(a)
# Normalised [0,255] as integer
c = 255*(a - np.min(a))/np.ptp(a).astype(int)
# Normalised [-1,1]
d = 2.*(a - np.min(a))/np.ptp(a)-1
또한 OP의 질문이 아닌 경우에도 언급 할 가치가 있습니다 .
e = (a - np.mean(a)) / np.std(a)
을 사용하여 크기를 조정할 수도 있습니다 sklearn
. 장점은 데이터를 평균 중심에 두는 것 외에도 표준 편차를 정규화 할 수 있으며 축, 피처 또는 레코드별로 수행 할 수 있다는 것입니다.
from sklearn.preprocessing import scale
X = scale( X, axis=0, with_mean=True, with_std=True, copy=True )
키워드 인수 axis
, with_mean
, with_std
자기 설명하고, 기본 상태에 표시됩니다. 인수가 copy
로 설정되면 작업이 현재 위치에서 수행됩니다 False
. 여기에 설명서가 있습니다 .
"i"(idiv, imul ..) 버전을 사용할 수 있으며 반 나쁘게 보이지 않습니다.
image /= (image.max()/255.0)
다른 경우에는 열을 기준으로 n 차원 배열을 정규화하는 함수를 작성할 수 있습니다.
def normalize_columns(arr):
rows, cols = arr.shape
for col in xrange(cols):
arr[:,col] /= abs(arr[:,col]).max()
간단한 해결책은 sklearn.preprocessing 라이브러리에서 제공하는 스케일러를 사용하는 것입니다.
scaler = sk.MinMaxScaler(feature_range=(0, 250))
scaler = scaler.fit(X)
X_scaled = scaler.transform(X)
# Checking reconstruction
X_rec = scaler.inverse_transform(X_scaled)
오류 X_rec-X는 0입니다. 필요에 따라 feature_range를 조정하거나 standart scaler sk를 사용할 수도 있습니다.
audio
-1과 +1 image
사이, 0과 255 사이 의 값을 최소-최대 스케일하려고합니다 .
를 사용하면 sklearn.preprocessing.minmax_scale
문제를 쉽게 해결할 수 있습니다.
예 :
audio_scaled = minmax_scale(audio, feature_range=(-1,1))
과
shape = image.shape
image_scaled = minmax_scale(image.ravel(), feature_range=(0,255)).reshape(shape)
note: Not to be confused with the operation that scales the norm (length) of a vector to a certain value (usually 1), which is also commonly referred to as normalization.
I tried following this, and got the error
TypeError: ufunc 'true_divide' output (typecode 'd') could not be coerced to provided output parameter (typecode 'l') according to the casting rule ''same_kind''
The numpy
array I was trying to normalize was an integer
array. It seems they deprecated type casting in versions > 1.10
, and you have to use numpy.true_divide()
to resolve that.
arr = np.array(img)
arr = np.true_divide(arr,[255.0],out=None)
img
was an PIL.Image
object.
참고URL : https://stackoverflow.com/questions/1735025/how-to-normalize-a-numpy-array-to-within-a-certain-range
'program story' 카테고리의 다른 글
마지막 태그 이후 모든 자식 커밋 가져 오기 (0) | 2020.07.30 |
---|---|
CMake가 Visual C ++ 컴파일러를 찾지 못함 (0) | 2020.07.30 |
Objective-C의 보호 된 메소드 (0) | 2020.07.30 |
에 포함 된 완고한 SVG를 어떻게 확장합니까? (0) | 2020.07.30 |
linq 표현식을 사용하여 중첩 된 오브젝트를 전개하는 방법 (0) | 2020.07.30 |