2015-12-16 294 views
1

假設我想複製一個數組的內容而不是另一個數組,這意味着複製數組的索引被保留並覆蓋第一個數組。在我的情況下,複製數組的長度將始終爲3,而複製數組的長度將爲任意長度。如何在保持索引的同時將一個numpy數組的內容複製到另一個數組中?

如果複製陣列超過三個,我能做到這一點很容易像這樣:

>>>a = numpy.zeros(3, int) 
>>>a 
a = array([0,0,0]) 
>>>b = numpy.array([2,3]) 
>>>a[:len(b)] = b 
>>>a 
a = array([2,3,0]) 

如果複製數組超過三個,我能做到這一點是這樣的:

>>>c = numpy.array([5,6,7,8]) 
>>>a = c[:3] 
>>>a 
a = array([5,6,7]) 

但是有沒有能夠做到這一點沒有havign寫一個if趕上這兩個條件一個更優雅的numpy的方法是什麼?像put()那樣會允許複製達到某個索引?

編輯:

想出了一個一個襯墊與任意大小的數組x工作:

a[:numpy.min([3, len(x)])] = x[:numpy.min([3, len(x)]) 

但還是會喜歡的東西清潔

+3

'a [:len(x)] = x [:len(a)]'? –

回答

4

爲了您的使用 - 案例:

a[:len(b)] = b[:3] 

關鍵是要記住,切片「過去的終結」一numpy的數組不會引發錯誤:

In [1]: foo = np.arange(3) 

In [2]: foo 
Out[2]: array([0, 1, 2]) 

In [3]: foo[:64] 
Out[3]: array([0, 1, 2]) 
+0

啊,我不知道這 – Anonymous

3

對於1D情況下,它也不是太糟糕:

a[:len(b)] = b[:len(a)] 

對於N-維ab,事情變得混亂,但仍屬合理的輔助函數:

def mismatched_copyto(from, to): 
    overlap_slices = tuple(slice(None, min(a, b)) for a, b in zip(from.shape, to.shape)) 
    to[overlap_slices] = from[overlap_slices] 

如果要定義某種廣播的不匹配編輯ndim s,它變得更加混亂。我不認爲我會打擾。

+0

謝謝,這實際上是爲了一個任意多維的情況,但我想我會在我的問題中發佈基本案例。我結束了 'imageData = numpy.zeros((width * height,3))'\ n '對於範圍(數據)中的n:'\ n 'imageData [n] [:len(data [n ])] = data [n] [:3]',其中'data'是任意大小的圖像的像素數據,以及三角形的通道數,'imageData'是轉換爲三通道RGB圖像即使初始通道數小於3。 – Anonymous

相關問題