【问题标题】:Get multiple results as output for one condition on numpy array获取多个结果作为 numpy 数组上一个条件的输出
【发布时间】:2020-07-21 18:04:13
【问题描述】:

我正在寻找一种方法来为 numpy 数组的一个条件获取多个结果。 目前,我在同一个 numpy 数组上运行相同的 where 条件两次,以获得两个具有不同输出的新数组。

import numpy as np
np_array = np.random.rand(3,3)
entry_array = np.where(np_array>=0.5,1,0)
mod_array = np.where(np_array>=0.5,np_array,0)

是否有一种可能性,我可以在np_array 上仅使用一个循环来填充两个新数组entries, mod_array。 此外,我也在寻找非数组输出的解决方案,如下所示。

entries = np.where(np_array>=0,1,0).sum()
sum_entries = np.where(np_array>=0,np_array,0).sum()

我对一种高效的方法特别感兴趣,因为我的数组有超过 1 亿个条目。

【问题讨论】:

  • Additionally, I am also looking for a solution for non-array output,你能解释一下什么是非数组输出吗?
  • 我不知道有什么解决方案可以一步完成这两项操作,但您至少可以通过使用mask = np_array >= 0.5 生成单个布尔掩码然后将其用于布尔值来减少计算时间索引。
  • Q的第二部分:entries = np.count_nonzero(np.array>=0.5)sum_entries = np.sum(np_array,where=np.array>=0.5)
  • @yatu 对于非数组输出,我指的是输出,其中使用条件对数组执行附加操作,并且仅返回单个值。就像第二个代码块中的sum()

标签: python arrays numpy


【解决方案1】:

很少有类似的想法:

def m1(np_array):
  entry_array = np.where(np_array>=0.5,1,0)
  mod_array = np.where(np_array>=0.5,np_array,0)
  return mod_array, entry_array

def m2(np_array):
  mod_array = np.where(np_array>=0.5,np_array,0)
  entry_array = np.array(mod_array, dtype=bool)+0
  return mod_array, entry_array

def m3(np_array):
  entry_array = np_array<0.5
  np_array[entry_array] = 0
  return np_array, 1-entry_array

比较:m1 似乎比 m2m3 稍慢(最多 2 倍)。

in_ = [np.random.rand(n,n) for n in [10,100,1000,10000,20000]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 2022-11-23
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多