簡體   English   中英

RecArray作為ndarray的視圖

[英]View of recarray as ndarray

在以前的numpy版本中,我可以執行以下操作:

data = np.array([(0,1,2),(3,4,5),(6,7,8)], dtype=np.dtype([('a','<f8'), ('b','<f8'),('c','<f8')]))


data_nd = data[['a','b']].view(('<f8',2))

這將使我看到原始Recarray data為np.float32類型的二維np.float32

在numpy版本1.14中,當我嘗試上述第二行時,出現錯誤:

ValueError: Changing the dtype to a subarray type is only supported if the total itemsize is unchanged

這是因為data[['a','b']]大小仍為24。好吧,這很好,但是有某種方法可以獲取那些更新項目大小的數據列的副本,以便我可以我想要的視圖?

例如,即使對data[['a','b']]進行復制(或深復制),其項大小仍為24,我不理解。

您是否意識到沒有元組,recarray是具有重復字段值的3x3:

In [46]: data
Out[46]: 
array([[(0., 0., 0.), (1., 1., 1.), (2., 2., 2.)],
       [(3., 3., 3.), (4., 4., 4.), (5., 5., 5.)],
       [(6., 6., 6.), (7., 7., 7.), (8., 8., 8.)]],
      dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])

無論如何,整個數組上的視圖仍然有效,您可以在上面使用常規的列切片:

In [47]: data.view(('float',(3,)))
Out[47]: 
array([[[0., 0., 0.],
        [1., 1., 1.],
        [2., 2., 2.]],

       [[3., 3., 3.],
        [4., 4., 4.],
        [5., 5., 5.]],

       [[6., 6., 6.],
        [7., 7., 7.],
        [8., 8., 8.]]])
In [48]: _.shape
Out[48]: (3, 3, 3)

tolist是用於與結構化陣列之間進行轉換的舊備用數據庫。 它仍然有效:

In [49]: np.array(data[['a','b']].tolist())
Out[49]: 
array([[[0., 0.],
        [1., 1.],
        [2., 2.]],

       [[3., 3.],
        [4., 4.],
        [5., 5.]],

       [[6., 6.],
        [7., 7.],
        [8., 8.]]])

data創建更改為包括元組,實際上並不會改變視圖的行為,但可能更接近您想要的(或無論如何我想要的):

In [50]: data1 = np.array([(0,1,2),(3,4,5),(6,7,8)], dtype=np.dtype([('a','<f8')
    ...: , ('b','<f8'),('c','<f8')]))
In [51]: data1
Out[51]: 
array([(0., 1., 2.), (3., 4., 5.), (6., 7., 8.)],
      dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])

注意,子字段顯示中現在包含一個offsets參數。

In [53]: data1[['a','b']]
Out[53]: 
array([(0., 1.), (3., 4.), (6., 7.)],
      dtype={'names':['a','b'], 'formats':['<f8','<f8'], 'offsets':[0,8], 'itemsize':24})

基礎數據庫是相同的,因此在有或沒有子字段索引的情況下,三列視圖均可工作:

In [54]: data1[['a','b']].view((float,(3,)))
Out[54]: 
array([[0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.]])
In [55]: data1.view((float,(3,)))
Out[55]: 
array([[0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.]])

我還沒有閱讀最新的更改。 取而代之的是,我使用了過去有效的各種技巧。 從結構化數組進行轉換從未如此簡單和簡單。

暫無
暫無

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

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