有一些關於numpy.where()
我不明白:使用numpy.where()通過矩陣迭代
比方說,我有一個2D numpy的ndarray:
import numpy as np
twodim = np.array([[1, 2, 3, 4], [1, 6, 7, 8], [1, 1, 1, 12], [17, 3, 15, 16], [17, 3, 18, 18]])
現在,想創建一個函數,它可以「檢查」這個numpy數組的各種條件。
array([[ 1, 2, 3, 4],
[ 1, 6, 7, 8],
[ 1, 1, 1, 12],
[17, 3, 15, 16],
[17, 3, 18, 18]])
例如,哪些條目此數組中有(A)的偶數(B)比7(C)被3整除更大?
我想用numpy.where()
這一點,並遍歷該陣列的每個條目,終於找到符合所有條件,(如果這樣的條目存在)的元素:
even_entries = np.where(twodim % 2 == 0)
greater_seven = np.where(twodim > 7)
divisible_three = np.where(twodim % 3 == 0)
怎樣才能做到這一點?我不知道如何通過布爾迭代...
我可以通過
np.argwhere(even_entries)
我們可以做這樣的事情
import numpy as np
twodim = np.array([[1, 2, 3, 4], [1, 6, 7, 8], [1, 1, 1, 12], [17, 3, 15, 16], [17, 3, 18, 18]])
even_entries = np.where(twodim % 2 == 0)
greater_seven = np.where(twodim > 7)
divisible_three = np.where(twodim % 3 == 0)
for row in even_entries:
for item in row:
if item: #equivalent to `if item == True`
for row in greater_seven:
for item in row:
if item: #equivalent to `if item == True`
for row in divisible_three:
for item in row:
if item: #equivalent to `if item == True`
# something like print(np.argwhere())
任何訪問性基質(i,j)的指數建議?
編輯1:下面的好主意。正如@hpaulj提到「你的測試產生了一個與twodim形狀相同的布爾矩陣」 這是我在玩的時候遇到的一個問題---並非所有的條件都產生了與我的起始矩陣相同形狀的矩陣。舉例來說,假設我比較數組元素是否具有匹配陣列向左或向右(即水平)
twodim[:, :-1] == twodim[:, 1:]
這導致在(5,3)布爾數組,而我們原來的矩陣一個(5,4)陣列
array([[False, False, False],
[False, False, False],
[ True, True, False],
[False, False, False],
[False, False, True]], dtype=bool)
如果我們做同樣的垂直,其導致一個(4,4)布爾數組,而原始矩陣是(5,4)
twodim[:-1] == twodim[1:]
array([[ True, False, False, False],
[ True, False, False, False],
[False, False, False, False],
[ True, True, False, False]], dtype=bool)
如果我們想知道哪些條目hav Ë都縱向和橫向對,這是不平凡弄清楚我們是在哪個維度
不要使用'where'。我不知道爲什麼新的NumPy用戶繼續使用它,但它不是一個好主意。您可以通過直接使用布爾模板來簡化操作。 – user2357112