[英]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
。 對數組應用all
或any
值會將其減小為一個標量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.