簡體   English   中英

如何在多維數組中找到否定元素? 正確使用.any().all()

[英]How to find negative elements in a multidimensional array? Use .any() .all() correctly

我有一個帶有負double元素的numpy數組arr 它的形狀為(1000,1000) 由於元素很復雜,因此我們使用arr.real僅評估實部。

我第一次嘗試

for i in arr.real:
    if i < 0:
        print(i)

這產生了以下ValueError:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

但是,如果我嘗試

for i in arr.real:
    if i.any() < 0:
        print(i)

要么

for i in arr.real:
    if i.all() < 0:
        print(i)

沒有輸出。 即使確實存在負值,也不會打印任何內容。

我該如何糾正? 我有什么誤會?

編輯:

for i in arr.real:
    print(i[i<0])

確實有效。 但是,如何搜索兩個條件? 例如,

i < 0 and i > -1e-12

由於arr是2d,因此迭代為您提供行,而不是元素。

制作一個樣本數組:

In [347]: arr=np.arange(16).reshape(4,4)-10
In [348]: arr
Out[348]: 
array([[-10,  -9,  -8,  -7],
       [ -6,  -5,  -4,  -3],
       [ -2,  -1,   0,   1],
       [  2,   3,   4,   5]])

重復一些打印:

In [350]: for i in arr:
   print(i)
   print(i<0)
   print((i<0).any())
   .....: 

結果:

[-10  -9  -8  -7]
[ True  True  True  True]
True
[-6 -5 -4 -3]
[ True  True  True  True]
True
[-2 -1  0  1]
[ True  True False False]
True
[2 3 4 5]
[False False False False]
False

當您嘗試在if語句中使用該布爾數組np.array([True, True, False, False])時,將發生ValueError 對數組應用allany值會將其減小為一個標量True / False值,該值可在if語句中使用。

您可以將negative測試應用於整個數組,並將all/any應用於行(或列)-無需迭代:

In [351]: arr<0
Out[351]: 
array([[ True,  True,  True,  True],
       [ True,  True,  True,  True],
       [ True,  True, False, False],
       [False, False, False, False]], dtype=bool)
In [352]: (arr<0).any(axis=1)
Out[352]: array([ True,  True,  True, False], dtype=bool)
In [353]: (arr<0).all(axis=1)
Out[353]: array([ True,  True, False, False], dtype=bool)

要獲取數組中的非負值,可以使用以下布爾掩碼(或其負值):

In [354]: arr[arr>=0]
Out[354]: array([0, 1, 2, 3, 4, 5])

由於每行中有不同數量的有效值,因此無法為您提供2d數組。

但是您可以返回迭代以獲取每一行的值列表。 在這里,我使用列表推導進行迭代。

In [355]: [a[a>=0] for a in arr]
Out[355]: 
[array([], dtype=int32),
 array([], dtype=int32),
 array([0, 1]),
 array([2, 3, 4, 5])]

您是否嘗試過lambda表達式?

for k in arr:
     print filter(lambda x: x < 0, k)

如果您的“數組”是具有元組鍵的字典,則可以像這樣使用lambda:

d = {(0,0):-3,(0,1):3,(0,2):-3.7,(0,3):0,
(1,0):30,(1,1):-12,(1,2):-0.1,(1,3):2.5,}

keys = filter(lambda x: d[x] < 0, [k for k in d])

print [d[keys[n]] for n in range(0,len(keys))]

也許實際回答您的問題會有所幫助,

import itertools as it
aK = it.product(range(0,len(arr)),range(0,len(arr)))

negKeys = filter(lambda x: arr[x[0]][x[1]] < 0, [k for k in ak])
negVals = [arr[k[0]][k[1]] for k in negKeys]

看來執行此操作的一種方法是:

for row in arr.real:
    for i in row:
        if (i<0 and i<-1e-10):
            print(i)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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