将二维数组与数字进行比较



我有一个形状为 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))

最新更新