2015-02-09 99 views
0

我是python和numpy的新手。我有數組的numpy的陣列,像這樣:如何轉換元素,然後插入到numpy數組

a = [[ 0.  2.  0.  0.  0.  0. ] 
    [ 0.  14.  0.  0.  0.  0. ]] 

對於第一陣列,其中,2是,我要插入1 0 0,而對於第二陣列,其中圖14是,我要插入0 0 1,以便最終結果如下所示:

a = [[ 0.  1.  0.  0.  0.  0.  0.  0. ] 
    [ 0.  0.  0.  1.  0.  0.  0.  0. ]] 

要做到這一點,最簡單的方法是什麼?

+0

我會用切片和'place()',參見http://docs.scipy.org/doc/numpy/reference/generated/numpy.pl ace.html – madtowneast 2015-02-09 17:52:08

+0

對於'2',您正在替換一個值。對於'14',你正在替換一個值(用0)並插入一個(2,2)數組。兩種不同的行爲。 – hpaulj 2015-02-09 20:35:44

回答

1

所需陣列與原始陣列a的形狀不同。 因此,您不能通過使用簡單片 分配或單個調用分配函數(如numpy.place,numpy.put,numpy.putmask, 或numpy.copyto)來生成所需的陣列。

因此,我認爲 可能更好地把它看作是一個新數組的構造,而不是把它當作賦值和插入操作。 有很多方法可以做到這一點:

  • 你可以使用numpy.concatenate

    np.concatenate([a[:,:1], b, a[:,2:]], axis=1) 
    
  • numpy.column_stack

    np.column_stack([a[:,:1], b, a[:,2:]]) 
    
  • numpy.c_

    np.c_[a[:,:1], b, a[:,2:]] 
    
  • numpy.bmat

    np.array(np.bmat([a[:,:1], b, a[:,2:]])) 
    
  • 或空數組分配空間和賦值的c片:

    c = np.empty((a.shape[0], a.shape[1]+b.shape[1]-1), dtype=a.dtype) 
    c[:, :1] = a[:, :1] 
    c[:, 1:4] = b 
    c[:, 4:] = a[:, 2:] 
    

    這是沒有必要在這裏,但它是很好的保持在介意分配和分配是構建數組的可行方法。有時候,儘管不在這裏,它甚至是你最快的選擇。

  • numpy.deletenumpy.insert

    np.insert(np.delete(a, [1], 1), [1], b, axis=1) 
    

    我不推薦使用insertdelete但是。 np.delete創建一個 值從a複製的新陣列。相反,切片a[:,:1]a[:,2:]的意見a所以他們不需要任何複製。額外的 分配和複製使得該方法比上面顯示的其他方法 慢。


例如,如果我們定義:

import numpy as np 
a = np.array([[ 0., 2., 0., 0., 0., 0.], 
       [ 0., 14., 0., 0., 0., 0.]]) 
b = np.array([(1, 0, 0), 
       (0, 0, 1)]) 

然後

In [69]: np.concatenate([a[:,:1],b,a[:,2:]], axis=1) 
Out[69]: 
array([[ 0., 1., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0., 0.]]) 

(其他選項產生相同的結果)

相關問題