簡體   English   中英

創建沒有固定第二維的3D numpy.ndarray

[英]Creating 3D numpy.ndarray with no fixed second dimension

有時,諸如語音數據之類的數據具有已知數目的觀測值(n),未知持續時間和已知數目的測量值(k)。

在NumPy中的2D情況下,很清楚如何用形狀為(n, )的ndarray表示觀察次數已知(n)且持續時間未知的數據。 例如:

import numpy as np

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

print(x.shape) ### Returns: (2, )

NumPy中的3D情況是否有等效項,在這里我們可以有形狀為(n, , k)ndarray 我能想到的最好的替代方法是使用形狀為(n, )的2D ndarray (n, )並使每個元素也是(k, )的(轉置)形狀的2D。 例如,

import numpy as np

x = np.array([ [ [1,2], [1,2] ],
               [ [1,2], [1,2], [1,2] ]
             ])

print(x.shape) ### Returns: (2, ); Desired: (2, , 2)

理想情況下,一種解決方案將能夠告訴我們ndarray的維數屬性,而無需遞歸調用(也許可以使用shape ?的替代方法)。

您似乎誤解了(2,)含義。 這並不意味着(2, <unknown>) ; 逗號不是2到某種空白尺寸之間的分隔符。 (2,)是一個元素為2的單元素元組的Python語法。 Python使用此語法,因為(2)表示整數2 ,而不是元組。

您不是在創建具有任意長度的第二維的二維數組。 您正在創建對象dtype的一維數組。 它的元素是普通的Python列表。 這樣的數組與NumPy中幾乎所有有用的東西都不兼容。

無論是在您認為可行的2D情況下,還是在嘗試進行工作的3D情況下,都無法創建具有可變長度尺寸的NumPy數組。

僅審查一維案例:

In [33]: x = np.array([[1,2],[1,2,3]])                                          
In [34]: x.shape                                                                
Out[34]: (2,)
In [35]: x                                                                      
Out[35]: array([list([1, 2]), list([1, 2, 3])], dtype=object)

結果是一個2元素的列表數組,從列表列表開始。 沒有太大的區別。

但是請注意,如果列表大小相同,則np.array會創建一個數字2d數組:

In [36]: x = np.array([[1,2,4],[1,2,3]])                                        
In [37]: x                                                                      
Out[37]: 
array([[1, 2, 4],
       [1, 2, 3]])

因此,不要指望我們在[33]中看到的行為。

我可以創建一個二維對象數組:

In [59]: x = np.empty((2,2),object)                                             
In [60]: x                                                                      
Out[60]: 
array([[None, None],                  # in this case filled with None
       [None, None]], dtype=object)

我可以為每個元素分配不同種類和大小的對象:

In [61]: x[0,0] = np.arange(3)                                                  
In [62]: x[0,0] = [1,2,3]                                                       
In [63]: x[1,0] = 'abc'                                                         
In [64]: x[1,1] = np.arange(6).reshape(2,3)                                     
In [65]: x                                                                      
Out[65]: 
array([[list([1, 2, 3]), None],
       ['abc', array([[0, 1, 2],
       [3, 4, 5]])]], dtype=object)

它仍然是2d。 在大多數情況下,它就像一個包含對象的列表或列表列表。 數據緩沖區實際上具有指向存儲在內存中其他位置的對象的指針(就像列表緩沖區一樣)。

確實沒有像3d數組那樣具有可變的最后維度的東西。 充其量我們可以得到一個二維數組,其中包含各種大小的列表或數組。


列出2個2d數組:

In [69]: alist = [np.arange(6).reshape(2,3), np.arange(4.).reshape(2,2)]        
In [70]: alist                                                                  
Out[70]: 
[array([[0, 1, 2],
        [3, 4, 5]]), array([[0., 1.],
        [2., 3.]])]

在這種情況下,將其提供給np.array會引發錯誤:在[71]中:np.array(alist)
-------------------------------------------------- ------------------------- ValueError:無法將輸入數組從形狀(2,3)廣播到形狀(2)

我們可以用以下列表中的元素填充對象數組:

In [72]: x = np.empty((4,),object)                                              
In [73]: x[0]=alist[0][0]                                                       
In [74]: x[1]=alist[0][1]                                                       
In [75]: x[2]=alist[1][0]                                                       
In [76]: x[3]=alist[1][1]                                                       
In [77]: x                                                                      
Out[77]: 
array([array([0, 1, 2]), array([3, 4, 5]), array([0., 1.]),
       array([2., 3.])], dtype=object)

並將其重塑為2d

In [78]: x.reshape(2,2)                                                         
Out[78]: 
array([[array([0, 1, 2]), array([3, 4, 5])],
       [array([0., 1.]), array([2., 3.])]], dtype=object)

結果是一個包含一維數組的二維數組。 為了獲得元素的形狀,我必須做一些事情:

In [87]: np.frompyfunc(lambda i:i.shape, 1,1)(Out[78])                          
Out[87]: 
array([[(3,), (3,)],
       [(2,), (2,)]], dtype=object)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM