2017-06-08 44 views
2

有兩個陣列,如:如何從作爲目標數組的子集的源數組中分配?

a = np.zeros((3, 4), dtype=int) 
[[0 0 0 0] 
[0 0 0 0] 
[0 0 0 0]] 

b = np.ones((2, 3), dtype=int) 
[[1 1 1] 
[1 1 1]] 

如何從源陣列(b)到目標數組存在於源(a)中的條目分配?

所得數組應該然後是:

[[1 1 1 0] 
[1 1 1 0] 
[0 0 0 0]] 

回答

5

可以簡單地獲得bshape如:

m,n = b.shape 

然後用切片來設置元件a

a[:m,:n] = b 

這產生:

>>> m,n = b.shape 
>>> a[:m,:n] = b 
>>> a 
array([[1, 1, 1, 0], 
     [1, 1, 1, 0], 
     [0, 0, 0, 0]]) 

在殼體ab具有相同而是任意維數,我們可以使用以下發電機:

a[tuple(slice(mi) for mi in b.shape)] = b 

其中結果如下:

>>> a[tuple(slice(mi) for mi in b.shape)] = b 
>>> a 
array([[1, 1, 1, 0], 
     [1, 1, 1, 0], 
     [0, 0, 0, 0]]) 

但是,這也適用於3d,4d,...陣列。

+0

很好的一般解決方案;我不知道「切片」功能。所以現在我可以自己創建一個函數'def slices(arr):返回元組(slice(mi)for mi in arr.shape)',然後簡單地執行'a [slices(b)] = b'。 – EquipDev

+1

@EquipDev:的確如此。如果你需要多次構建這樣的元組,這絕對是人爲的。 –

4

獲取陣列的形狀要被分配,然後slice目標數組和分配 -

m,n = b.shape 
a[:m,:n] = b