numpy
과 함께 다음 문제에 봉착 한 것처럼 보입니다. I를 갖기 때문에, binvals
의 값 (및 일부 bins
)에있어서, X.shape = (nexp, ntime, ndim, npart)
내가 npart
사이즈에 따라이 배열 비닝 통계를 계산하기 위해 필요하지만,이 다른 모든 치수를 유지 :numpy binned mean, 여분의 축 보존
는 I 모양으로 배열 X
을 binned 통계를 사용하여 원본 배열의 일부 바이어스를 제거합니다. Binning 값의 모양은 binvals.shape = (nexp, ntime, npart)
입니다.
내가하려는 일을 설명하기위한 완벽한 최소한의 예입니다. 실제로, 나는 큰 배열과 빈의 여러 hunderds 함께 일하고 (그래서이 구현은 영원히 소요) 참고 :
import numpy as np
np.random.seed(12345)
X = np.random.randn(24).reshape(1,2,3,4)
binvals = np.random.randn(8).reshape(1,2,4)
bins = [-np.inf, 0, np.inf]
nexp, ntime, ndim, npart = X.shape
cleanX = np.zeros_like(X)
for ne in range(nexp):
for nt in range(ntime):
indices = np.digitize(binvals[ne, nt, :], bins)
for nd in range(ndim):
for nb in range(1, len(bins)):
inds = indices==nb
cleanX[ne, nt, nd, inds] = X[ne, nt, nd, inds] - \
np.mean(X[ne, nt, nd, inds], axis = -1)
가 명확하게 수도의 결과를 보면?
In [8]: X
Out[8]:
array([[[[-0.20470766, 0.47894334, -0.51943872, -0.5557303 ],
[ 1.96578057, 1.39340583, 0.09290788, 0.28174615],
[ 0.76902257, 1.24643474, 1.00718936, -1.29622111]],
[[ 0.27499163, 0.22891288, 1.35291684, 0.88642934],
[-2.00163731, -0.37184254, 1.66902531, -0.43856974],
[-0.53974145, 0.47698501, 3.24894392, -1.02122752]]]])
In [10]: cleanX
Out[10]:
array([[[[ 0. , 0.67768523, -0.32069682, -0.35698841],
[ 0. , 0.80405255, -0.49644541, -0.30760713],
[ 0. , 0.92730041, 0.68805503, -1.61535544]],
[[ 0.02303938, -0.02303938, 0.23324375, -0.23324375],
[-0.81489739, 0.81489739, 1.05379752, -1.05379752],
[-0.50836323, 0.50836323, 2.13508572, -2.13508572]]]])
In [12]: binvals
Out[12]:
array([[[ -5.77087303e-01, 1.24121276e-01, 3.02613562e-01,
5.23772068e-01],
[ 9.40277775e-04, 1.34380979e+00, -7.13543985e-01,
-8.31153539e-01]]])
벡터화 된 솔루션이 있습니까? 내가 scipy.stats.binned_statistic
을 사용하는 것을 생각했지만,이 목적을 위해 그것을 사용하는 방법을 이해할 수없는 것 같습니다. 감사!
더미 입력을 제공 할 수 있습니까? – norok2
무엇을 의미합니까? 'X = np.random.randn (120) .extape (3,4,2,5)','binvals = np.random.randn (24) .reshape (3,4,2)'그리고 'bins = np.linspace (binvals.min(), binvals.max(), 10)' – user6760680
게시 된 코드의 샘플 데이터와'IndexError : boolean index did not match ..'가 발생했습니다. – Divakar