[英]Removing ndarray from list in python
很奇怪的問題,給你細節供你重現。
我有一個 ndarray x = [[ 58.0376135 ], [4739.44845915]]
,它被定義為 ndarray 大小 (2,1)
我也有這個清單
lst = [array([[11120.19965669],[ 1036.7331153 ]]),
array([[ 58.0376135 ],[4739.44845915]]),
array([[ 766.38433838],[5524.3418457 ]])]
(2,1) ndarray 的列表。 如您所見, x == lst[1]
。
但是,當我x in lst
寫入lst.remove(x)
或 x 時,我得到值錯誤,即具有多個元素的數組的真值不明確。 奇怪的是,在其他例子中它確實有效。
我怎樣才能讓它在這里工作呢?
這是一種方法:
[arr for arr in lst if not np.all(x==arr)]
由於x
是多維的,您需要使用np.all()
而不是像x in arr
這樣的逐元素比較
對於 NumPy 數組arr
,表達式arr in seq
返回元素方式in seq
操作,即布爾數組。
如果結果數組只有一個元素,則表達式的計算結果為True
或False
,具體取決於該元素的 boolean 值。 但是,每當您嘗試在 boolean 上下文中評估具有多個元素的數組時,您都會得到一個ValueError
,因為在這種情況下,真值是不明確的。 您可以通過any
或all
消除歧義。 運行這段代碼來說服自己:
In [1282]: x = np.array([0])
In [1283]: y = np.array([0, 1])
In [1284]: bool(x)
Out[1284]: False
In [1285]: bool(y)
Traceback (most recent call last):
File "<ipython-input-1285-c0cc820b77c4>", line 1, in <module>
bool(y)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
In [1286]: any(y)
Out[1286]: True
In [1287]: all(y)
Out[1287]: False
如果你想檢查一個數組是否包含在一個列表中,你可以像這樣使用 NumPy 的array_equal
:
In [1295]: def array_in_list(arr, alist):
...: for item in alist:
...: if np.array_equal(arr, item):
...: return True
...: return False
In [1296]: array_in_list(x, lst)
Out[1296]: True
In [1297]: array_in_list(2*x, lst)
Out[1297]: False
用allclose
替換array_equal
可能很方便,以避免與浮點比較相關的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.