【问题标题】:Search through two 3 column numpy array and find where meets criteria in Python搜索两个 3 列 numpy 数组并在 Python 中找到符合条件的位置
【发布时间】:2020-05-10 02:20:09
【问题描述】:

我有两个类似的 numpy 数组

Population A

Score A Score B Answer
  1       0.3      1    
  0       0.5      0
  1       0.6      1     
  0       0.7      1
  1       0.9      1

Population B

Score A Score B Answer
  1       0.3      1    
  0       0.5      0
  1       0.6      1     
  1       0.7      1
  0       0.9      1

 Sample Results are
 ScoreB     Ratio 
  0.3        1
  0.5        1
  0.6        1
  0.7        1

我必须在每个总体中找到分数 B 的分数/值,高于该值的任何值都变为 1,否则为 0,例如,如果您在总体 A 中选择 0.5,则第一个值为 0,其余为 1,如果您选择 0.6例如,在人口 B 中,前两个值为 0,其余为 1。

我猜我可能在 while 循环中迭代地/算法地执行此操作,并且不创建或替换 scoreB 这样

Ratio = (counts(scoreA=1&scoreb=1&Answer=1) in population A/ counts(scoreA=1&scoreb=1&Answer=1) in population B) == 1

注意:分数 B 已排序,因此不必担心

【问题讨论】:

  • 这听起来像np.where(),但你的描述不是很清楚。也许您想要的输出样本会有所帮助。
  • 添加了看到在这种情况下只有 0.3,0.5,0.6 和 0.7 产生相同的比率,只要你去 0.9 比率标准不匹配
  • 比率很奇怪:对于 0.9,总体 B 中的计数为 0。你除以零吗?如果流行 B 中的计数小于流行 A 中的计数,你得到的比率是否大于 1?

标签: python arrays algorithm numpy loops


【解决方案1】:

您可以在 numpy 数组上使用 logical_and 或简单地使用 * 运算符,以提供元素明智的乘法

import numpy as np
def count_match (v, A, B, C):

  cond = np.logical_and(A == 1, B >= v)
  cond = np.logical_and(cond, C == 1)
  # alternatively, use an element wise product:
  cond = (A == 1) * (B >= v) * (C == 1)

  # counting the number of 1
  count = np.sum(cond)
  return count

A_a = np.array([1, 0, 1, 0, 1])
B_a = np.array([0.3, 0.5, 0.6, 0.7, 0.9])
C_a = np.array([1, 0, 1, 1, 1])

A_b = np.array([1, 0, 1, 1, 0])
B_b = np.array([0.3, 0.5, 0.6, 0.7, 0.9])
C_b = np.array([1, 0, 1, 1, 1])
for v in [0.3, 0.5, 0.6, 0.7, 0.9]:
  print(v, count_match(v, A_a, B_a, C_a) / count_match(v, A_b, B_b, C_b)) # divides by zero brr

注意,对于 popA 和 popB,数组 A 和 C 上的条件不会改变,因此您可能已经预先计算它们(我怀疑它会改变那么多时间)

def count_match2(v, pre_cond, B):
  return np.sum(pre_cond * (B >= v))

for v in [0.3, 0.5, 0.6, 0.7, 0.9]:
  print(v, count_match2(v, (A_a == 1) * (C_a == 1), B_a) / count_match2(v, (A_b == 1) * (C_b == 1), B_b)) # divides by zero brr

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 2015-09-22
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2021-05-01
    • 2017-09-19
    相关资源
    最近更新 更多