我有一个带有负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
答案 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
。将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])
由于每行中有不同数量的有效值,因此无法为您提供二维数组。
但是你可以回到迭代来获取每行的值列表。在这里,我使用列表推导来进行迭代。
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)