Encontrei este exemplo no numpydoc:
np.promote_types('i4', 'S8')
dtype('S11')
Basicamente, não consigo entender o seguinte:
Um i4 ocupa 4 bytes e um S8 ocupa 8 bytes. Então, por que – em termos de memória – preciso de um S11 para acomodar os dois tipos? Eu teria esperado o S8 como resultado.
S8 é uma sequência de caracteres. Portanto, o caso relevante a considerar ao escolher um dtype para acomodar i4 e S8 é representar o número mais longo possível em i4 como uma sequência de caracteres.
Para representar -2.147.483.648 como uma string, você precisa de 11 caracteres. É por isso que você obtém o S11 como resultado.
Um exemplo de 'visualização' do mesmo padrão de bits de 'i4' e 'S8' é:
O buffer de dados 4*4=16 pode ser visto como dois 'S8'
A conversão/promoção de tipo ocorre quando tentamos fazer um novo array, como concatenar, a partir do array inteiro e do string:
ou com o formato de string unicode padrão: