似乎你总是可以使用强制查看缓冲区np.array:
view = np.array(data, dtype=dt, copy=not data.flags['C_CONTIGUOUS'])
虽然这是一种快速而肮脏的方法,但在这种情况下数据会被复制,并且dt2
没有得到正确应用:
>>> 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,))])
对于更正确的方法(在某些情况下),您可以使用原始np.ndarray构造函数:
real_view = np.ndarray(data.shape[:1], dtype=dt2, buffer=data)
这使得数据的真实视图:
>>> real_view
array([(['a', '1'],), (['a', 'z'],), (['b', 'a'],)], dtype=[('x', 'O', (2,))])
>>> real_view.base is data
True
如图所示,这仅在数据具有 C 连续行时才有效。