2016-09-22 92 views
2

說我有包含相同長度的列表這個對象數組:轉換1D對象列表的numpy的陣列到二維數字陣列和背部

>>> a = np.empty(2, dtype=object) 
>>> a[0] = [1, 2, 3, 4] 
>>> a[1] = [5, 6, 7, 8] 
>>> a 
array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object) 
  1. 我怎樣才能將其轉換爲數字二維數組?

    >>> a.shape 
    (2,) 
    >>> b = WHAT_GOES_HERE(a) 
    >>> b 
    array([[1, 2, 3, 4], 
         [5, 6, 7, 8]]) 
    >>> b.shape 
    (2, 4) 
    
  2. 我該怎麼做呢?

  3. 是否變得更加容易,如果我的a陣列是np.arraynp.array S,而不是list S的np.array

    >>> na = np.empty(2, dtype=object) 
    >>> na[0] = np.array([1, 2, 3, 4]) 
    >>> na[1] = np.array([5, 6, 7, 8]) 
    >>> na 
    array([array([1, 2, 3, 4]), ([5, 6, 7, 8])], dtype=object) 
    
+0

'a.astype(int)'? – Divakar

+0

@Divakar:'ValueError:設置一個數組元素的序列.''''''''不能重塑 – Eric

回答

3

一種方法使用np.concatenate -

b = np.concatenate(a).reshape(len(a),*np.shape(a[0])) 

改善由@Eric建議使用*np.shape(a[0])應該使其成爲通用ND形狀工作。

採樣運行 -

In [183]: a 
Out[183]: array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object) 

In [184]: a.shape 
Out[184]: (2,) 

In [185]: b = np.concatenate(a).reshape(len(a),*np.shape(a[0])) 

In [186]: b 
Out[186]: 
array([[1, 2, 3, 4], 
     [5, 6, 7, 8]]) 

In [187]: b.shape 
Out[187]: (2, 4) 

要返回a,似乎我們可以使用一個兩步的過程,就像這樣 -

a_back = np.empty(b.shape[0], dtype=object) 
a_back[:] = b.tolist() 

採樣運行 -

In [190]: a_back = np.empty(b.shape[0], dtype=object) 
    ...: a_back[:] = b.tolist() 
    ...: 

In [191]: a_back 
Out[191]: array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object) 

In [192]: a_back.shape 
Out[192]: (2,) 
+0

很好的簡明的解決方案 - 我在想我可能不得不求助於循環 – Eric

+0

替換'-1 'np.shape(a [0])'使得這個工作可以用於ND - > N + 1D的更一般的1D案例 – Eric

+0

@Eric感謝您的改進!更新了帖子。 – Divakar

1

你可以使用np.vstack():

>>> a = np.vstack(a).astype(int) 
+0

我認爲'astype()'也是不必要的! – Eric

+0

是的,你是對的,雖然你沒有明確地說你最終想要int(儘管 - 在這個例子中是什麼......),所以最好留下它;) –

+0

我只是說數字,在這種情況下無論如何,dtype似乎是int32 – Eric

0

下面是NumPy的陣列輸入源轉換成列表,然後進入所期望的NumPy的陣列的方法:

b = np.array([k for k in a]) 
b 
array([[1, 2, 3, 4], 
     [5, 6, 7, 8]]) 
c = np.array([k for k in b], dtype=object) 
c 
array([[1, 2, 3, 4], 
     [5, 6, 7, 8]], dtype=object) 
0

我發現,往返通過listnp.array(list(a))就足夠了。

這似乎相當於使用np.stack(a)

這兩種方法都有益於將ND陣列的1D陣列轉換爲(N + 1)D陣列的更一般情況。