如何在多维数组中找到负面元素?正确使用.any()。all()

时间:2016-01-22 19:58:27

标签: python arrays numpy multidimensional-array

我有一个带有负arr元素的numpy数组double。形状为(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

3 个答案:

答案 0 :(得分:4)

由于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

当您尝试在ValueError语句中使用该布尔数组np.array([True, True, False, False])时,会产生if。将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])

由于每行中有不同数量的有效值,因此无法为您提供二维数组。

但是你可以回到迭代来获取每行的值列表。在这里,我使用列表推导来进行迭代。

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])]

答案 1 :(得分:1)

您是否尝试过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]

答案 2 :(得分:-2)

这似乎是一种方法:

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