我想與numba使用numpy,但我得到奇怪的結果,同時嘗試訪問或設置一些值爲浮點型數組使用浮點型索引轉換爲int 。 檢查這個基本功能。在Python/Numba中訪問數組給出奇怪的結果
@numba.jit("void(f8[:,::1],f8[:,::1])")
def test(table, index):
x,y = int(index[0,0]), int(index[1,0)
table[y,x] = 1.0
print index[0,0], index[1,0], x,y
print table
print table[y,x]
table = np.zeros((5,5), dtype = np.float32)
index = np.random.ranf(((2,2)))*5
test(table, index)
結果:
index[0,0] = 1.34129550525 index[1,0] = 0.0656177324359 x = 1 y = 0
table[0,1] = 1.0
table [[ 0. 0. 1.875 0. 0. ]
[ 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. ]]
爲什麼我能在這個表中的1.875,而不是1.0?這是一個基本的例子,但我正在與大數組一起工作,它給了我很多錯誤。我知道我可以將索引轉換爲np.int32並更改@ numba.jit(「void(f8 [:,:: 1],f8 [:,1])」)到@ numba.jit (「void(f8 [:,:: 1],i4 [:,:: 1])」),這是工作正常,但我想你想明白爲什麼這是行不通的。 從python解析類型到C++時它是一個問題?
感謝您幫助
沒有在JIT的F8聲明和初始化np.float32之間的差異? 1.875不在x = 1處。 順便說一句,爲什麼它被標記爲C++? – Joky
@Joky C++標籤是一個錯誤的抱歉。是的,它與np.float64一起工作。 但對於像1.0這樣的數字應該浮動32或浮動64有所作爲? –
既然您標記了C++;):問題是該表是一個指向double的指針,指向一個float數組。在位置1重疊位置3/4的浮點數(2倍大)和在兩個浮點數上的雙精度編碼沒有任何意義。順便說一句,這是一個猜測,因爲我不知道什麼是numba生成的代碼。編輯:unutbu下面解釋清楚。 – Joky