2015-05-27 122 views
0

我想能夠轉換數組,如如何從數組中創建1元素數組的數組?

a = np.array([[1,2], [3,4]]) 

到同一陣列,但各元件作爲1個元素的數組,而不是一個號碼。 所需的輸出將是:

np.array([[np.array([1]), np.array([2])], [np.array([3]), np.array([4])]]) 
+0

你爲什麼要這麼做?在幾乎所有的情況下,似乎都沒有必要和適得其反。也許你需要爲你的數組添加一個額外的維度('a [...,None]')或者[數組標量](http://docs.scipy.org/doc/numpy/reference/arrays。 scalars.html)機制讓你可以用你最初的'a'來做你需要做的事情。 – user2357112

+0

另外,澄清; 'np。array([[[1],[2]],[[3],[4]]])匹配你想要的,還是你真的想要一個其中有其他arrray對象的數組,而不是一個三維數組? – user2357112

回答

0

您所描述的操作非常很少有用。更有可能的是,這將是一個更好的主意,長度爲1的一個額外的維度添加到您的數組的末尾:

a = a[..., np.newaxis] 
# or 
a = a.reshape(a.shape + (1,)) 

然後a[0, 1]將是一維數組,但所有的美好NumPy的功能,如廣播和ufuncs會工作的權利。請注意,這會創建原始數組的視圖;如果您需要獨立副本,則可以撥打copy()方法。

如果你真的想要一個二維數組,其元素是一維數組,NumPy不會讓你變得那麼容易。 (組織數據幾乎不是一種好的方法,所以NumPy開發人員沒有太多理由提供一種簡單的方法來完成它。)您可能希望創建這樣一個數組的大部分內容將創建一個3D陣列。最直接的辦法做到這一點我知道的是創建對象D型的空數組和填充細胞一個接一個,使用普通的Python循環:

b = numpy.empty(a.shape, dtype=object) 
for i in range(a.shape[0]): 
    for j in range(a.shape[1]): 
     b[i, j] = numpy.array([a[i, j]]) 
0
np.array([ [ [x] for x in row ] for row in [[1,2], [3,4]] ]) 
+0

目前尚不完全清楚OP正在尋找什麼行爲,但即使這產生了,它也是一種可怕的方式。使用列表解析幾乎可以消除NumPy的所有好處。 – user2357112

+0

Numpy非常適合對數組進行數學處理(點積,轉置,乘法等),但是如果你沒有完成其中一項工作,你可以在python中完成。 – singron

+0

你可以用Python來完成,但是你會讓代碼變得非常糟糕,並且在array [...,None] .copy()方面的速度下降1000倍,或者只是用'數組[...,無]'。 NumPy可以做更多的數組形狀操作,而不僅僅是'thing.T'。 – user2357112

0

你的戰鬥np.array企圖創造一個高維陣列。

例如,你想要表達的,輸入的時候,產生了一個(2,2,1)陣列:

a2 = np.array([[np.array([1]), np.array([2])], [np.array([3]), np.array([4])]]) 

In [172]: a2 
Out[172]: 
array([[[1], 
     [2]], 

     [[3], 
     [4]]]) 

這實際上可能是你想要的(儘管印刷出場),因爲

In [180]: a2[0,0] 
Out[180]: array([1]) 

經常打的numpy的傾向提出更高的第二陣列的最好辦法,就是初始化它用正確的shapedtype爲空,然後往裏面:

In [183]: a1=np.empty(a.shape,dtype=object)  
In [184]: a1.flat=[np.array(x) for x in a.flatten()] 
In [185]: a1 
Out[185]: 
array([[array(1), array(2)], 
     [array(3), array(4)]], dtype=object) 

它具有正確的形狀(2,2)和dtype。元素是數組 - 但它們的尺寸是「錯誤的」,而不是(1,),而不是()flatflatten是用於迭代nd數組的好用工具,就像它們是1d一樣。

a1.flat=[np.array([x]) for x in a.flatten()]不起作用 - 它是ints的一個數組,如a,但帶有對象dtype。

更明確的反覆做工作:

In [214]: a1=np.empty(a.shape,dtype=object) 
In [215]: for i in np.ndindex(2,2): 
    a1[i]=np.array([a[i]]) 
In [216]: a1 
Out[216]: 
array([[array([1]), array([2])], 
     [array([3]), array([4])]], dtype=object) 
相關問題