2013-12-04 4 views
0

Когда я создаю Numpy ndarray,NumPy ndarray неинициализированные значения интересные

c = np.ndarray((4, 5)) 

я получаю:

c = array([[ 6.58119589e-295,    nan, 2.10077583e-312, 
     1.08646184e-311, 2.84381388e-308], 
    [ 1.93933443e-309, 1.20154015e-306, 2.90571629e-298, 
    -7.52450413e-266, 3.00029506e-309], 
    [ 1.75738822e+159, 1.75738821e+159, 2.17292369e-310, 
     8.73989988e+245, 1.77863364e+248], 
    [ 8.65447358e+251, 6.21822202e+175, 2.63920065e-314, 
     6.60553537e-295, 6.06307776e-295]]) 

Это очень интересно для меня, так как все значения являются либо очень большой положительный или близко к нуль, и иногда я могу иметь NaN.

Что такое механизм позади?

Как это связано с sys.float_info который sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)?

Готов видеть ваше мнение.

UPDATE:

Я вижу это мусор в пространстве памяти, но то, что определяет их интерпретации в эти цифры? Или сказать, как python представляет числа с плавающей запятой?

UPDATE ON UPDATE:

Я вижу, как числа с плавающей точкой работы, но почему эти показатели находятся в определенной схеме?

+0

Я обновил свой ответ со ссылками, описывающих точки представления с плавающей запятой. Пожалуйста, сделайте свой вопрос более конкретным, в его обновленном состоянии он слишком широк или непонятен, что вы просите, следовательно, кажется, что это не тема для SO. – alko

+0

было бы интересно увидеть статистическое распределение их на самом деле, так как они действительно почти всегда + -1e150 или что-то вроде + -1e300 + или так, и никогда 1e50 или что-то в этом роде, – usethedeathstar

+0

@usethedeathstar вы можете это сделать, это легко с 'np.histogram'. Я склонен видеть нули;) – alko

ответ

1

Numpy выделяет необходимую память для вашего массива в соответствии с его типом (по умолчанию np.float). Если не инициализирован, результат, который вы видите, - это преобразование мусора в выделенную память. Не все возможные комбинации байтов могут быть преобразованы в float, следовательно, NaN, то есть Not a Number.

Update

Как вы спрашиваете о плавающей точкой представление, прочитать wiki или IEEE 754 standard.

np.float является 64 bit по умолчанию:

>>> np.finfo(np.float) 
finfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64) 

На 64b зева вы можете иметь [float128] :(http://en.wikipedia.org/wiki/Quadruple_precision_floating-point_format)

>>> np.finfo(np.float128) 
finfo(resolution=1e-18, min=-1.18973149536e+4932, max=1.18973149536e+4932, dtype=float128) 
0

В соответствии с documentation, если вы позвоните по номеру ndarray без аргумента buffer, значения, которые он заполняет, являются случайными. Они рекомендуют использовать array, zeros или empty для создания нового массива, а не низкоуровневого ndarray.

+0

Спасибо! Но почему это случайным образом? – Ray

Смежные вопросы