2017-03-16 65 views
0

我正在與Keras和提供的MNIST數據集一起工作。我相信數據集是一個numpy數組。我有如下重塑它:如何映射numpy數據集?

X_train = X_train.reshape(X_train.shape[0], 1, 28, 28) 
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28) 

這給出了一個(60000, 1, 28, 28) numpy的陣列。這可以閱讀爲60000 28×28圖像。我想提取每一個28×28的圖像,並對其應用某種函數f。我曾嘗試以下:

f = lambda a, _: print a.shape 
np.apply_over_axes(f, data, [2,3]) 

但我不確定究竟第二axis參數進場,但...

我也試過:

f = lambda a: print a.shape 
np.apply_along_axis(f, 0, data) 

但形狀總是(60000,)而不是我所期望的(1, 28, 28)。我如何獲得每個子圖像?

回答

1

沒有使用np.apply_along_axisnp.vectorize等只需使用一個循環獲得的性能:

import numpy as np 

s = (4,1,28,28) 
a = np.zeros(s) 
for img in a[:,0]: 
    print(img.shape) 

# (28, 28) 
# (28, 28) 
# (28, 28) 
# (28, 28) 
+0

啊,好的。這個符號更有意義!謝謝! – Dair

1

lambda沒有意義:

lambda a, _: print a.shape 

這相當於

def foo(a, x): 
    return print a.shape 

print a.shape打印出一些東西,並且沒有返回值,甚至錯誤。

lambda a,x: a.shape更好,返回形狀a,並忽略x參數。

如果尺寸爲1,那爲什麼不直接省略呢?

X_train = X_train.reshape(X_train.shape[0], 28, 28) 

或刪除其

X_train[:,0,...] 
np.squeeze(X_train) 

但什麼是apply_over點?只是爲了找到一組子矩陣的形狀?

In [304]: X = np.ones((6,1,2,3)) 
In [305]: [x.shape for x in X] 
Out[305]: [(1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3)] 

[x.shape for x in X[:,0]] 

以去除第二尺寸,獲得的最後2

apply_along_axis只是形狀,在最後3暗淡迭代,傳遞一維數組的拉姆達。所以實際上它返回X[:,0,i,j].shape

In [308]: np.apply_along_axis(lambda a: a.shape, 0, X) 
Out[308]: 
array([[[[6, 6, 6], 
     [6, 6, 6]]]]) 

通常這樣的迭代是不需要的。使用時,與「全數組」相比較慢。

+0

'返回打印expr'返回'None'。我試圖測試的是維度,所以'lambda'基本上是無用的。至於'1'尺寸,我跟着的教程說這是神經網絡所需要的:https://elitedatascience.com/keras-tutorial-deep-learning-in-python '_'按慣例是用來做什麼的忽略變量。 – Dair

+0

我想給一個最小的可驗證的例子。就目前而言,apply_over電話只是爲了證明我的問題。最終,我想對60000個圖像中的每一個應用一個功能。但是目前'f'不打印'(1,28,28)'矩陣,它會打印'(60000)'矩陣。但是我想對每個'(1,28,28)'矩陣應用一個函數。 – Dair

+1

然後只是在第一維上循環:'[f(x)for x in X]''。 – hpaulj