2017-06-13 147 views
1

我目前正在研究一個大小爲(100,5,1)的稱爲X的3d數組。我想將隨機創建的2d數組稱爲s,尺寸爲(5,1)X。我的代碼如下所示。我得到100 (5,1)數組,他們都是一樣的。我可以看到爲什麼我有這個結果,但我找不到解決方案。如何在NumPy中將二維數組的值分配給三維陣列

我需要在X有100個獨特的(5,1)陣列。

+3

簡單地一次性創建所需大小的「100 x 5 x 1」3D矩陣不是更容易嗎? 's = np.random.uniform(low = -1,high = 2,size =(100,5,1))'......特別是因爲每個'5 x 1'向量來自相同的概率分佈。你爲什麼要單獨創建100個'5×1'陣列? – rayryeng

+1

不應該是'X [i,j,:] = s [j]'? – Divakar

+0

@Divakar是的。是的,應該的。 – rayryeng

回答

2

您正在對整個第一維進行索引,並因此廣播單個5 x 1數組。這就是爲什麼你看到副本,它只記得你在整個第一維上看到的循環中創建的最後一個隨機生成的5 x 1數組。要解決這個問題,只需將索引從:更改爲i即可。

X[i,j,:] = s[j] 

但是,這似乎是一個不好的代碼氣味。我建議通過將size輸入參數覆蓋到numpy.random.uniform來一次性分配所需的確切大小。

s = np.random.uniform(low=-1, high=2, size=(100, 5, 1)) 

因此,不要循環使用上述語句一次。這是有道理的,因爲您創建的每個5 x 1陣列都是從相同的概率分佈中採樣的。從效率角度來看,只需分配一次所需的大小就更有意義。

+0

實際上,當我重寫s的大小參數時,我得到廣播錯誤。但它似乎只適用於X [i,j,:] = s [j] – kneazle

+0

@kneazle覆蓋'size'的目的是讓你**不需要循環。你只需要使用一個語句。因此,用s = np.random.uniform(low = -1,high = 2,size =(100,5,1))'代替你的整個代碼。在你的循環中使用這些代碼顯然會給你帶來廣播錯誤。 – rayryeng

+0

哦,是啊!非常感謝! :) – kneazle

相關問題