簡體   English   中英

從 python 的列表中刪除 ndarray

[英]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操作,即布爾數組。

如果結果數組只有一個元素,則表達式的計算結果為TrueFalse ,具體取決於該元素的 boolean 值。 但是,每當您嘗試在 boolean 上下文中評估具有多個元素的數組時,您都會得到一個ValueError ,因為在這種情況下,真值是不明確的。 您可以通過anyall消除歧義。 運行這段代碼來說服自己:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM