我正在嘗試將 np.where() 函式與嵌套串列一起使用。我想找到嵌套串列第一層的給定條件的索引。
例如,如果我有以下代碼
arr = [[1,1], [2,2],[3,3]]
a = np.where(arr == [2,2])
那么理想情況下,我希望代碼將“a”回傳為 1。因為 [2,2] 在嵌套串列的索引 1 中。
但是,結果我只是得到一個空陣列。
當然,我可以通過實作外部 for 回圈使其輕松作業,例如
for n in range(len(arr)):
if arr[n] == [2,2]:
a = n
但我想簡單地在函式 np.where 中實作這一點(在此處撰寫整個代碼)。
有沒有辦法做到這一點?
uj5u.com熱心網友回復:
最好的解決方案是@Michael Szczesny 提到的,但是np.where你也可以這樣做:
a = np.where(np.array(arr) == [2, 2])[0]
resulted_ind = np.where(np.bincount(a) == 2)[0] # --> [1]
uj5u.com熱心網友回復:
那么你可以撰寫自己的函式來做到這一點:
你需要
- 找到與您要查找的內容相同的每一行
- 獲取找到的行的索引(您可以使用
where):
numpy壓縮
您可以使用壓縮運算子來查看每行是否滿足條件。如:
np_arr = np.array(
[1, 2, 3, 4, 5]
)
print(np_arr < 3)
這將回傳每個元素所在True或False滿足條件的布林值:
[ True True False False False]
對于 2D 陣列,您將得到一個 2D 布爾陣列:
to_find = np.array([2, 2])
np_arr = np.array(
[
[1, 1],
[2, 2],
[3, 3],
[2, 2]
]
)
print(np_arr == to_find)
結果是:
[[False False]
[ True True]
[False False]
[ True True]]
現在我們正在尋找具有all True值的行。所以我們可以使用all的方法ndarray。我們將向所有人提供我們希望看到的軸。X、Y 或兩者。我們要查看 x 軸:
to_find = np.array([2, 2])
np_arr = np.array(
[
[1, 1],
[2, 2],
[3, 3],
[2, 2]
]
)
print((np_arr == to_find).all(axis=1))
結果是:
[False True False True]
獲取Trues 的索引
最后,您正在尋找值所在的索引True:
np.where((np_arr == to_find).all(axis=1))
結果將是:
(array([1, 3]),)
uj5u.com熱心網友回復:
numpy在 Python 中運行,因此您可以使用基本的 Python 串列和numpy陣列(更像 MATLAB 矩陣)
串列串列:
In [43]: alist = [[1,1], [2,2],[3,3]]
串列有一個index方法,該方法針對串列的每個元素進行測驗(這里的元素是 2 個元素串列):
In [44]: alist.index([2,2])
Out[44]: 1
In [45]: alist.index([2,3])
Traceback (most recent call last):
Input In [45] in <cell line: 1>
alist.index([2,3])
ValueError: [2, 3] is not in list
alist==[2,2]回傳False,因為串列與[2,2]串列不同。
如果我們從該串列中創建一個陣列:
In [46]: arr = np.array(alist)
In [47]: arr
Out[47]:
array([[1, 1],
[2, 2],
[3, 3]])
我們可以做一個==測驗 - 但它比較數字元素。
In [48]: arr == np.array([2,2])
Out[48]:
array([[False, False],
[ True, True],
[False, False]])
這種比較的基礎是 的概念broadcasting,允許它比較 (3,2) 陣列和 (2,)(2d 和 1d)。這是微不足道的,但它可能要復雜得多。
要查找所有值為 True 的行,請使用:
In [50]: (arr == np.array([2,2])).all(axis=1)
Out[50]: array([False, True, False])
并在該陣列中where找到True(結果是具有 1 個陣列的元組):
In [51]: np.where(_)
Out[51]: (array([1]),)
在 Octave 中,等價于:
>> arr = [[1,1];[2,2];[3,3]]
arr =
1 1
2 2
3 3
>> all(arr == [2,2],2)
ans =
0
1
0
>> find(all(arr == [2,2],2))
ans = 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/450773.html
上一篇:我寫了這段代碼并收到了這個錯誤。我應該如何解決這個問題?
下一篇:如何修復IndexError:只有整數、切片(`:`)、省略號(`...`)、numpy.newaxis(`None`)和整數或布爾陣列是有效的索引
