【问题标题】:filtering negative values in a numpy array过滤numpy数组中的负值
【发布时间】:2021-10-05 09:54:16
【问题描述】:

我正在尝试编写一个 numpy 函数来显示数组中小于 0 的值的数量。我怎么能做到这一点?

import numpy as np

array = np.array([10,4,3,5,6,67,3,-12,5,-6,-7])

预期输出:

3

【问题讨论】:

  • 你可以得到一个满足你条件的布尔数组并调用 sum:(array < 0).sum().

标签: python arrays numpy indexing filter


【解决方案1】:

您可以使用以下方式打印它:

print(sum([i for i in array if i < 0]))

你可以将它设置为一个变量:

lessThanZero = sum([i for i in array if i < 0])

做了一个基准(各种)

import datetime
import numpy
numpySum=0
forLoop=0
test = numpy.array([1,2,3,4,5,6,7,8,9,0])
for k in range(1000):
    a = datetime.datetime.now()
    for j in range(100):
        z = (test<5).sum()
    b = datetime.datetime.now() - a
    a = datetime.datetime.now()
    for j in range(100):
        z = [i for i in test if i < 5]
    a = datetime.datetime.now() - a
    if b<a:numpySum+=1
    else: forLoop+=1
    
print(numpySum, forLoop)

3 次运行的输出:

633 367
752 248
714 286 

似乎 numpy 总和更快:D

这是一个大小为 10 的数组。我再次尝试了大小为 1000 的数组,并且每次都赢得了 numpy sum 的答案!

【讨论】:

  • 这将给出负值的总和而不是计数。
  • 这不是处理 numpy 数组的方法。这将在 python 时间运行,但原生 numpy 方法将在 C 时间运行(可能快几个数量级)
  • 我用numpy的不多,所以想测试一下。谢谢@roganjosh,这完全有道理。 numpy 显然赢了。
【解决方案2】:

只需将数组与一个值进行比较(即负值小于零),然后调用sum,因为您只需要计数。

>>> array = np.array([10,4,3,5,6,67,3,-12,5,-6,-7])
>>> (array<0).sum()
3

如果您想要这些值而不仅仅是计数,那么使用掩码来获取这些值

>>> array[array<0]
array([-12,  -6,  -7])

【讨论】:

  • 我从来没有意识到列表是这样做的,这只是一个 numpy 数组吗?
  • 是的,它是 numpy