Зная заранее желаемую ширину байтов, вы можете взять view
массива с желаемой структурой как:
arr = np.array([[b'13456789'],
[b'45678912']], dtype='|S8')
arr.view('S2,S3,S1,S2')
array([[(b'13', b'456', b'7', b'89')],
[(b'45', b'678', b'9', b'12')]],
dtype=[('f0', 'S2'), ('f1', 'S3'), ('f2', 'S1'), ('f3', 'S2')])
Yo просто нужно сделать убедитесь, что общий размер в байтах последней оси массива с новым dtype является делителем исходного размера. Это означает, что вы также можете сделать что-то вроде:
arr.view('S2,S2')
array([[(b'13', b'45'), (b'67', b'89')],
[(b'45', b'67'), (b'89', b'12')]],
dtype=[('f0', 'S2'), ('f1', 'S2')])
То же самое относится к массиву строк Юникода фиксированного размера, например:
a = np.array([['peach'],
['apple']], dtype='U5')
a.view('U1')
array([['p', 'e', 'a', 'c', 'h'],
['a', 'p', 'p', 'l', 'e']], dtype='<U1')