我有一个形状为 5000x10 的 2D 数组,基本上就像 10 种类型的值取 5000 次(因此 5000 个配置文件(,我想看看这些配置文件中有多少个值大于像 X 这样的数字。
a=np.array([[1,2,3,4,5],[1,2,3,4,6],[-1,2,3,4,-5]])
这里的 a 具有 3x5 的形状,因此 3 种类型的配置文件。我想查看有多少配置文件完全正 (>0( 或完全大于 X,所以我使用了以下代码:
d=0
for x in range(3):
if(a[x,:].all()>0):
d=d+1
但是 d 返回 3,情况不应该如此,因为a[2,:]
并不完全为正。 在这种情况下我该怎么办?
好吧,你尝试使用 list 的.all()
方法,该方法不存在,所以你的代码根本不应该工作:
>>> a = [1, 2, 3]
>>> a.all()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'all'
如果它是一个 NumPy 数组,根据 @AKX 的评论,它的.all(…)
方法只会测试是否所有元素的计算结果都为True
,但负整数在 Python 中的计算结果也为True
:
>>> bool(-1)
True
你应该做的是使用内置的all(…)
函数:
a = [[1, 2, 3, 4, 5], [1, 2, 3, 4, 6], [-1, 2, 3, 4, -5]]
d = 0
for inner_list in a:
if all(x > 0 for x in inner_list):
d += 1
或者您可以使用sum(…)
函数:
d = sum(1 for inner_list in a if all(x > 0 for x in inner_list))
如您所见,我在这两种情况下都使用了for inner_list in a
,这只是一种比使用其索引更好的迭代列表元素的方法——在您的情况下,它实际上等效于:
for i in range(len(a)): # or "in range(3)" in your specific case
inner_list = a[x]
...
a = [[1,2,3,4,5],[1,2,3,4,6],[-1,2,3,4,-5]]
d = 0
for x in range(3):
if (all(e > 0 for e in a[x])):
d = d+1
当a[x]
等于[-1,2,3,4,-5]
时,[e > 0 for e in a[x]]
等于[False, True, True, True, False]
。 然后,all(e > 0 for e in a[x])
检查[False, True, True, True, False]
中的所有值是否都True
。
下面是可能会有所帮助的代码
a=np.array([[1,2,3,4,5],[1,2,3,4,6],[-1,2,3,4,-5]])
d=0
for iter1 in range (a.shape[0]):
flag = True
for iter2 in range (a.shape[1]):
print (a[iter1][iter2])
if a[iter1][iter2] < 0:
flag = False
print("moving to next row check the flag value="+ str(flag))
if flag:
d = d+1
print("Number of profiles which are positive="+ str(d))