2016-03-12 65 views
0

我有一些代碼在輸入數據的矩陣上執行各種處理功能。輸入數據可能是2,3或4D。Numpy矩陣 - 如何處理任意大小

我需要從輸入數據中去除n-1維矩陣以進行處理,然後另一個矩陣接收到這個處理後的數據。爲了處理不同大小的輸入數據,最好的辦法是什麼?

例如,此刻,我有以下形式的代碼:

import numpy as np 

if number_dims == 2: 
    output_matrix = np.zeros([size_dim1,final_size_dim2]) 
    for i in range(0,dim1,1): 
     data_to_process = input_data[i,:] 
     output_matrix[i,:] = processing_funcs(data_to_process) 

if number_dims == 3: 
    output_matrix = np.zeros([size_dim1,final_size_dim2,final_size_dim3]) 
    for i in range(0,dim1,1): 
     data_to_process = input_data[i,:,:] 
     output_matrix[i,:,:] = processing_funcs(data_to_process) 

if number_dims == 4: 
    output_matrix = np.zeros([size_dim1,final_size_dim2,final_size_dim3,final_size_dim4]) 
    for i in range(0,dim1,1): 
     data_to_process = input_data[i,:,:,:] 
     output_matrix[i,:,:,:] = processing_funcs(data_to_process) 

是否有蟒蛇做一個很好的方式,而不重複的if語句?複雜之處,在n-1個間接尺寸的最終數據大小是不一樣的輸入大小,所以我不能例如,只是做:

output_matrix = np.zeros([np.shape(input_data)]) 

這也將是不錯的,如果有無論有多少其他維度,都可以沿維度1切片。

回答

1

這些是功能上是相同的:

output_matrix[i,:,:,:] 
output_matrix[i,...] 
output_matrix[i] 

或者更一般地:

x[:,i,j,:,:] 
x[:,i,j,...] 
x[:,i,j] 

只要那麼很顯然,尺寸被編入索引,尾隨`:」可被省略,或者取代用省略號('...')。省略號也可以用在開始或中間 - 再次提供表達式不含糊。

np.takenp.put在對某些軸進行索引時也很有用。

您也可以創建索引(和sliceellipsis)的元組,並使用該

In [222]: ind=(slice(3,5),slice(None),1,Ellipsis) 
In [223]: x[ind].shape 
Out[223]: (2, 3, 32) 

我認爲所有的情況下,可以進行處理:

result = np.zeros_list(input_data) 
for i in range(input_data.shape[0]): 
    result[i] = processing_funcs(input_data[i]) 

result = [processing_funcs(subdata) for subdata in input_data] 
result = np.array(result)  

在一個數組上迭代有效地索引第一個軸。將結果收集到列表中,然後將結果傳遞給np.array是創建數組的一種標準方法。 np.array通常將列表中的元素組合到新維度中的新數組中。您也可以使用concatenate,但可能需要添加初始維度。

result = [processing_funcs(subdata)[None,...] for subdata in input_data] 
result = np.concatenate(result, axis=0) 
1
for i in range(dim1): 
     output_matrix[i] = processing_funcs(input_data[i]) 

應該工作,不管其他維度。對於形狀,可能你可以做一些像output_matrix=zeros(f(input_matrix.shape))

+0

'final_size_dim2'等是已知的,但是,例如,一個2D將不具有用於'final_size_dim3','final_size_dim4'值 - 這些可能被設置爲'None'或'[]' - 但例如,'np.zeros([final_size_dim2,None,None])'是不允許的,因此使用上面的'if'語句。 – 218