2017-05-03 139 views
-1

我發現修改/分配numpy.ndarray就像: X [j,...,c] =東西。 不按我期望的方式工作。請參閱以下代碼段和相關輸出在Python(numpy)中修改ndarray的正確方法是什麼?

X_train_norm = np.zeros_like(X_train) 
for j in range(100, 102): 
    for c in range(X_train.shape[-1]): 
     X_train_norm[j,...,c] = X_train[j,...,c] - means[j, c] 
     print(j, c, np.mean(X_train_norm[j,...,c]), np.mean(X_train[j,...,c] - means[j,c])) 


100 0 152.491210938 0.0 
100 1 153.384765625 0.0 
100 2 164.598632812 0.0 
101 0 148.837890625 0.0 
101 1 151.559570312 0.0 
101 2 162.604492188 0.0 

(means is a Nx3 array and X_train is a Nx32x32x3 array) 

什麼是創建輸出的正確方法?

編輯:我得到了它的代碼片段像這樣的工作:

z = X_train[j,...] - means[j,] 
if X_train_norm is None: 
    X_train_norm = np.array(z, ndmin=4) 
else: 
    X_train_norm = np.vstack([X_train_norm, np.array(z, ndmin=4)]) 

我肯定有一個更高效,更Python的方式來做到這一點。感謝您的期待!

+2

' 「不工作我會expect'方式」 詳細點嗎? – Divakar

+0

如果我計算'z = X_train [j,...,c] - 意味着[j,c]',z看起來與我做'X_train_norm [j,...,c] = .... '。輸出說明了這一點。 –

+0

更新了代碼的代碼片段 –

回答

0

呃!這是一個類型問題。

X_train was uint8. 
X_train_norm = np.zeros_like(X_train,dtype='float64') 
X_train_norm = X_train_norm.astype(float) 
for j in range(100, 102): 
    z = X_train[j,...] - means[j,] 
    print(z.shape, z.mean()) 
    X_train_norm[j] = z 
    print(X_train_norm[j].shape, X_train_norm[j].mean()) 

正確打印

(32, 32, 3) 0.0 
(32, 32, 3) 0.0 
(32, 32, 3) 0.0 
(32, 32, 3) 0.0 
相關問題