numpy.empty
не очищает биты знака вручную или что-либо еще.Знаковые биты - это просто остатки мусора в тех битах возвращаемого значения malloc
.Эффект, который вы видите, связан с вызовом numpy.absolute
где-то еще.
Дело в том, что numpy.empty
не использует повторно буфер возвращаемого значения randn
.В конце концов, возвращаемое значение randn
остается в силе, когда empty
создает свой массив из-за переменной _
.
numpy.empty
повторно использует буфер массива, созданного в процессе строковый первый массив.Я полагаю, что это этот :
def fillFormat(self, data):
# only the finite values are used to compute the number of digits
finite_vals = data[isfinite(data)]
# choose exponential mode based on the non-zero finite values:
abs_non_zero = absolute(finite_vals[finite_vals != 0])
...
Видите этот absolute
звонок?Вот один из них.
Вот некоторые дополнительные тесты, которые подтверждают этот вывод:
>>> a = numpy.random.randn(3, 3)
>>> b = numpy.arange(-5, 4, dtype=float)
>>> c = numpy.arange(-5, 13, 2, dtype=float)
>>> a
array([[-0.96810932, 0.86091026, -0.32675013],
[-1.23458136, 0.56151178, -0.37409982],
[-1.71348979, 0.64170792, -0.20679512]])
>>> numpy.empty((3, 3))
array([[ 0.96810932, 0.86091026, 0.32675013],
[ 1.23458136, 0.56151178, 0.37409982],
[ 1.71348979, 0.64170792, 0.20679512]])
>>> b
array([-5., -4., -3., -2., -1., 0., 1., 2., 3.])
>>> numpy.empty((3, 3))
array([[ 0.96810932, 0.86091026, 0.32675013],
[ 1.23458136, 0.56151178, 0.37409982],
[ 1.71348979, 0.64170792, 0.20679512]])
>>> c
array([ -5., -3., -1., 1., 3., 5., 7., 9., 11.])
>>> numpy.empty((3, 3))
array([[ 5., 3., 1.],
[ 1., 3., 5.],
[ 7., 9., 11.]])
>>> numpy.array([1.0, 0, 2, 3, 4, 5, 6, 7, 8, 9])
array([ 1., 0., 2., 3., 4., 5., 6., 7., 8., 9.])
>>> numpy.empty((3, 3))
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]])
На результаты numpy.empty
влияет печать a
и c
, а не процесссоздания этих массивов.b
не имеет никакого эффекта, поскольку имеет 8 ненулевых элементов.Финал array([1.0, 0, 2, ...])
имеет эффект, потому что, хотя в нем 10 элементов, ровно 9 из них ненулевые.