簡體   English   中英

替換 Numpy 數組的一部分時避免不正確的舍入

[英]Avoid incorrect rounding when part of a Numpy Array is replaced

在我的代碼的一部分中,我將以下代碼與 numpy 數組一起使用:

import numpy as np

A=np.array([[1,-8],[2,-1],[2,14]])

k=2
x = np.array([[0],[15]])       

v=np.array([[1/np.sqrt(2)],[1/np.sqrt(2)]])

temp = x - 2*v @ v.T @ x

print("temp = ",temp)
I=np.array([[0,0],[0,0],[0,0]])
print("I = ",I)

I[k-1:3,k-1:2]= temp
print("new I =",I)

這是我看到的輸出:

temp =  
[[-1.50000000e+01]
 [ 3.55271368e-15]]
I =  
[[0 0]
 [0 0]
 [0 0]]
new I = 
[[  0   0]
 [  0 -14]
 [  0   0]]

但是 -1.50000000e+01 = -15 所以我不確定為什么這個元素被 -14 替換。

如果我修改您的代碼以創建 float dtype 數組,尤其是I

In [88]: A=np.array([[1,-8],[2,-1],[2,14]], float)    ###
    ...:  
    ...: k=2 
    ...: x = np.array([[0],[15]])        
    ...:  
    ...: v=np.array([[0.70710678],[0.70710678]]) 
    ...:  
    ...: temp = x - 2*v @ v.T @ x 
    ...:  
    ...: print("temp = ",temp) 
    ...: I=np.array([[0,0],[0,0],[0,0]], float)      ####
    ...: print("I = ",I) 
    ...:  
    ...: I[k-1:3,k-1:2]= temp 
    ...: print("new I =",I)                                                                    
temp =  [[-1.49999999e+01]
 [ 5.03409456e-08]]
I =  [[0. 0.]
 [0. 0.]
 [0. 0.]]
new I = [[ 0.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00 -1.49999999e+01]
 [ 0.00000000e+00  5.03409456e-08]]

round比截斷給了我更多的控制:

In [90]: np.round(I)                                                                           
Out[90]: 
array([[  0.,   0.],
       [  0., -15.],
       [  0.,   0.]])
In [91]: I.astype(int)                                                                         
Out[91]: 
array([[  0,   0],
       [  0, -14],
       [  0,   0]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM