Visualizza l'array di oggetti in un dtype diverso
Vorrei visualizzare un array di oggetti con un dtype che incapsula intere righe:
data = np.array([['a', '1'], ['a', 'z'], ['b', 'a']], dtype=object)
dt = np.dtype([('x', object), ('y', object)])
data.view(dt)
ottengo un errore:
TypeError: Cannot change data-type for object array.
Ho provato le seguenti soluzioni alternative:
dt2 = np.dtype([('x', np.object, 2)])
data.view()
data.view(np.uint8).view(dt)
data.view(np.void).view(dt)
Tutti i casi generano lo stesso errore. C'è un modo per visualizzare un array di oggetti con un dtype diverso?
Ho anche provato un approccio più generale (questo è per riferimento, poiché è funzionalmente identico a quanto mostrato sopra):
dt = np.dtype(','.join(data.dtype.char * data.shape[1]))
dt2 = np.dtype([('x', data.dtype, data.shape[1])])
Risposte
Sembra che tu possa sempre forzare la visualizzazione di un buffer usando np.array:
view = np.array(data, dtype=dt, copy=not data.flags['C_CONTIGUOUS'])
Sebbene questo sia un approccio rapido e sporco, i dati vengono copiati in questo caso e dt2non vengono applicati correttamente:
>>> print(view.base)
None
>>> np.array(data, dtype=dt2, copy=not data.flags['C_CONTIGUOUS'])
array([[(['a', 'a'],), (['1', '1'],)],
[(['a', 'a'],), (['z', 'z'],)],
[(['b', 'b'],), (['a', 'a'],)]], dtype=[('x', 'O', (2,))])
Per un approccio più corretto (in alcune circostanze), puoi usare il np.ndarraycostruttore grezzo:
real_view = np.ndarray(data.shape[:1], dtype=dt2, buffer=data)
Questo rende una vera vista dei dati:
>>> real_view
array([(['a', '1'],), (['a', 'z'],), (['b', 'a'],)], dtype=[('x', 'O', (2,))])
>>> real_view.base is data
True
Come mostrato, questo funziona solo quando i dati hanno righe contigue C.