96863


numpyの情報落ちを防ぐ方法はありますでしょうか？  
例えば、下記のコードであれば  
[0.000000000000000000001486436280241437]  
[-0.999999999999999999998514...]  
といった出力を期待しているのですが、  
結果的に2行目のprintは  
[-1.]  
となってしまいます。

情報落ちを防ぐ方法を探しているのですが、何か良い方法はありますでしょうか。

[code]

    import numpy as np
    print(np.power(np.array([10.0]) + 1, -20))
    print(np.power(np.array([10.0]) + 1, -20) - 1)
    
[/code]

【質問の背景】  
sklearn.preprocessing.PowerTransformerを使用して、Yeo-Johnson変換を実行しているのですが  
transformモジュールの中で下記の処理を実行しているようです。  
ここの処理で情報落ちが発生してエラーとなっている状態です。

[code]

    (np.power(x[pos] + 1, lmbda) - 1) / lmbda
    
[/code]


CC BY-SA 4.0
2023-11-21T04:44:08.930
96861
2023-11-21T05:19:47.753
2023-11-21T04:47:58.160
44067
44067
question
python numpy
numpyの情報落ちを防ぐ方法はありますでしょうか？


Decimal を使うとか？

[code]

    from decimal import *
    import numpy as np
    
    print(np.power(np.array([Decimal(10.0)]) + 1, -20))
    print(np.power(np.array([Decimal(10.0)]) + 1, -20) - 1)
    
[/code]


CC BY-SA 4.0
2023-11-21T05:12:48.003
96862
2023-11-21T05:12:48.003
7290
96861
answer


`Decimal` 型にするとよいかもしれません。ただし、元の `numpy.float64` 型での計算と比較すると実行速度は落ちると思われます。

[code]

    >>> import numpy as np
    >>>
    >>> arr = np.power(np.array([10.0]) + 1, -20)
    >>> arr.dtype
    dtype('float64')
    >>>
    >>> from decimal import Decimal
    >>> arr = np.vectorize(Decimal.from_float)(arr)
    >>> arr
    array([Decimal('1.48643628024143692488090018058568364159624895579727024715987852843124272794739226810634136199951171875E-21')],
          dtype=object)
    >>> arr.dtype
    dtype('O')
    >>>
    >>> arr - 1
    array([Decimal('-0.9999999999999999999985135637')], dtype=object)
    
[/code]


CC BY-SA 4.0
2023-11-21T05:19:47.753
96863
2023-11-21T05:19:47.753
47127
96861
answer