2016-04-03 16 views
2

我一直試圖解決這個問題超過2個小時。我的腳本和控制檯中使用點積的不同輸出

我寫了一個腳本,我把一些調試print小號

... 
print(array) 
print(m) 
print(np.dot(m.ravel(),array.ravel())) 
... 

當我啓動它,我有這樣的輸出:

$ ./test.py 
[[ 0  0  0  0  0  0  0] 
[ 0  0  0  0  0  0  0] 
[ 0  0  0  0  0  0  0] 
[ 0  0  0 20303 20303 20303 20303] 
[20303 20303 20303 20303 20303 20303 20303] 
[20303 20303 20303 20303 20303 20303 20303] 
[20303 20303 20303 20303 20303 20303 20303]] 
[[False False False False False False False] 
[False False False False False False False] 
[False False False False False False False] 
[False False False False True False False] 
[False False True False True False False] 
[False False False True False False False] 
[False False False False False False False]] 
15676 

當我試圖重現一個python控制檯此行爲,我對點積有不同的結果:

$ /usr/bin/python3 
Python 3.4.2 (default, Oct 8 2014, 10:45:20) 
[GCC 4.9.1] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import numpy as np 
>>> array=np.array([[ 0,  0,  0,  0,  0,  0,  0], 
[ 0,  0,  0,  0,  0,  0,  0], 
[ 0,  0,  0,  0,  0,  0,  0], 
[ 0,  0,  0, 20303, 20303, 20303, 20303], 
[20303, 20303, 20303, 20303, 20303, 20303, 20303], 
[20303, 20303, 20303, 20303, 20303, 20303, 20303], 
[20303, 20303, 20303, 20303, 20303, 20303, 20303]]) 
>>> 
>>> m=np.array([[False, False, False, False, False, False, False], 
[False, False, False, False, False, False, False], 
[False, False, False, False, False, False, False], 
[False, False, False, False, True, False, False], 
[False, False, True, False, True, False, False], 
[False, False, False, True, False, False, False], 
[False, False, False, False, False, False, False]]) 
>>> np.dot(m.ravel(),array.ravel()) 
81212 

什麼會導致這種情況?順便說一句,81212是我期望的結果,真的不明白我的腳本中發生了什麼。

+1

嘗試運行'/ usr/bin/python3 test.py'只是爲了確保。 –

+0

什麼Python解釋器'test.py'正在運行? 'test.py'的[shebang](https://en.wikipedia.org/wiki/Shebang_(Unix))是什麼? – Finwood

+0

'#!/ usr/bin/python3' :( – nicoco

回答

0

在我的腳本中,array的dtype是uint16,而我在控制檯中創建它時是int64。轉換它的類型解決了這個問題,但我不明白爲什麼它是必要的。

1

實際上沒有解決這個問題,但也許一個解決辦法:

np.ravel已NumPy的1.10略有改變,也許這是導致 「怪異」 的行爲:

截至NumPy的1.10,返回的數組將具有與輸入數組相同的類型。 (例如,掩碼陣列將返回掩碼陣列輸入)

但是,在這種情況下,您真的需要np.ravel嗎?怎麼樣只是用boolean indexing和總結的結果:

>>> print(array[m].sum()) 
81212 

如果這是你想在第一時間獲得什麼,這種方法可能比np.dot婷扁平陣列更「Python化」。

+0

我確實需要點積,性能如果你是感興趣的原因,看看我以前的問題http://stackoverflow.com/questions/35845085/n1-dim-boolean-masking-an-dim-array-with-array-of-means-as-desired-output 也,我真的很想了解這裏發生了什麼。 – nicoco

相關問題