2017-02-09 84 views
-1

目前我有一個具有形狀(33,)的元素X.我想將其改爲(33,501),因爲我知道每行都有501個元素。鐵。 X[0] = [0, 1, 0, 0, .. 0, 1] 我試過Python - 更改對象形狀?

np.reshape(X, (33,501)) 

但它的錯誤與ValueError: total size of new array must be unchanged。即使每行都是501長。

+2

'X'沒有任何「行」,它的形狀是'(33)'...顯然你是錯誤。 –

+0

什麼類型是'X'和'X [0]'?可能工作的是'X = np.array(X)' –

+0

'X.dtype'返回'dtype('O')','X [0]'是一個列表。 –

回答

1

要從開始的結構不是2-d陣列但含有列表作爲其元素的1 d陣列。這看起來可能相似,但實際上完全不同。

一個典型的(有例外)m×n數組是一個mn元素的線性塊,還有一些允許numpy以正確的方式解釋索引的「元數據」(像[i,j])。

相比之下,您的數組是一個1d的對象引用塊(c語言中的指針),因此如果要解析單個元素,則會添加另一個間接級別。首先檢索列表,然後檢索其元素。

陣列不提供適當的numpy數組所提供的大部分便利性和速度改進,所以最好將其轉換。

通常,np.array工廠將兼容長度的嵌套序列轉換爲儘可能深的數組。你的情況是個例外,因爲在技術上它已經是一個數組,所以np.array只是淺拷貝它(它複製列表引用而不是列表本身),包括形狀。

繞過的一個方法是將之前投放到列表:

np.array(list(original_array)) 
0

我的猜測是你有一個列表,其中有33個列表,其中501長。

你可以將它轉換爲2維數組(矩陣)或數據框,可以用幾種不同的方式完成;一個簡單的一個將是:

df = pd.DataFrame([]) 

counter = 0 

for array in X: 

    df['column_%d' %counter] = array 

    counter = counter + 1