Oi, Bernardo! Tudo bem com você?
Quanto a primeira pergunta, o resultado obtido é dado como 0
por conta do tipo de dado do array que é um int64
:
np_array = np.arange(1000000)
print(type(np_array[0]))
Resultado:
<class 'numpy.int64'>
Esse tipo de dado não vai conseguir armazenar valores numéricos que foram multiplicados por 2 por 100 vezes, pois são valore muito grandes e a variável não tem espaço suficiente para armazenar essa quantidade de valores. Uma opção para poder visualizar o resultado é trocar o tipo de variável para o tipo float64
que pode armazenar uma quantidade superior de valores e portanto não haverá problema em mostrar os dados. Para isso, basta declarar o parâmetro dtype
na criação do array definindo o valor como np.float64
:
np_array = np.arange(1000000, dtype = np.float64)
for _ in range(100): np_array *=2
np_array
Temos então o array com os seguintes valores:
array([0.00000000e+00, 1.26765060e+30, 2.53530120e+30, ...,
1.26764680e+36, 1.26764806e+36, 1.26764933e+36])
Os quais a expressão e
significa que acontece uma multiplicação de 10 elevada ao número colocado ao lado. Por exemplo, no segundo valore temos 1.26765060e+30
, que representa 1.26765060
* 10^(+30)
, mostrando que de fato os valores são muito grandes.
Por fim, quanto sua ultima pergunta, o uso do _
é puramente feita por convenção. Quando utilizamos um for
que desejamos apenas que ele faça suas rotinas sem necessitar usar a variável que está sendo contada, normalmente, colocamos o undescore (_
) para indicar que esse valor não é útil para a lógica que iremos utilizar. Você pode sim utilizar o i
ou colocar um item
mas isso é menos usual.
Espero ter te ajudado, bons estudos!