2016-06-06 17 views
0

fragte ich eine Frage gestern, die schön answered by @jezraelLinksverschiebung Inkonsistenz

Dabei war er verwendet:

df = pd.DataFrame([[1, 0, 1], [1, 1, 0], [0, 1, 1], [0, 0, 1]]) 

print (df.T.dot(1 << np.arange(df.shape[0] - 1, -1, -1))) 

0 12 
1  6 
2 11 
dtype: int64 

Die 1 << np.arange(df.shape[0]) für df.shape[0] große Werke von weniger als 30, aber bläst danach auf. Dies ist auch unter Berücksichtigung eines Datentyps von int32 oder int64 verständlich. Es wird eine Grenze geben. Wenn ich jedoch nur eine <<int Operand Linksverschiebung ausführen, gibt es long zurück und behält die Genauigkeit bei. Wie erhalte ich numpy, um das gleiche Ergebnis wie bei der Verwendung von 1 << 60 zu erhalten?

Hier ist, was ich lief:

import numpy as np 



for n in range(0, 61, 10): 
    a = np.arange(n + 1, dtype=int) 

    pstr = "for n = {:<5d}; 1 << a[-1] = {:<12d}; 1 << n = {:<12d}" 
    print pstr.format(n, 1 << a[-1], 1 << n) 

for n = 0 ; 1 << a[-1] = 1   ; 1 << n = 1   
for n = 10 ; 1 << a[-1] = 1024  ; 1 << n = 1024   
for n = 20 ; 1 << a[-1] = 1048576  ; 1 << n = 1048576  
for n = 30 ; 1 << a[-1] = 1073741824 ; 1 << n = 1073741824 
for n = 40 ; 1 << a[-1] = 256   ; 1 << n = 1099511627776 
for n = 50 ; 1 << a[-1] = 262144  ; 1 << n = 1125899906842624 
for n = 60 ; 1 << a[-1] = 268435456 ; 1 << n = 1152921504606846976 
+0

int32 kann nicht als 2147483647 größer sein, so was Sie tun erwarte '1 << 60' zu sein? – Daniel

+0

@Daniel wenn ich '1 << 60 'renne bekomme ich' 1152921504606846976' als lang. – piRSquared

+0

, aber dieser Wert ist zu groß für ein int32. Was ist der int32-Wert, den Sie erwarten? – Daniel

Antwort

4

Sie haben Ihr Array von int32 zu einer Reihe von Python-Objekte zu konvertieren:

numbers = np.arange(100,dtype=int) 
longs = 1 << np.arange(100).astype(object)