【问题标题】:Fastest way to check which rows in Numpy Matrix match value conditions?检查 Numpy Matrix 中哪些行匹配值条件的最快方法?
【发布时间】:2021-11-17 22:34:12
【问题描述】:

我有一个 2D numpy array。每行都包含时间采样数据,这些数据必须与几个不同的可能标准相匹配。

对于每一行,必须应用几个不同的标准。每一行都是来自系统的数据,每个标准代表可以检测到的不同情况。如果行中的选择列在某个区间内(大于和小于某个值),则检测到条件条件。

有没有办法在numpy 中快速有效地做到这一点?尽管我是numpy 的新手,但我一直在环顾四周并没有真正找到方法。

我正在考虑一种散列机制,例如为每一行存储一些散列并查看条件的散列是否与该行的散列匹配。但是,散列机制仅适用于固定值,而不适用于值范围。因此,这实际上并不适用。

示例数据:

import numpy as np
myData = np.array([[7.241, 7.123, 9.0, 1.2, 1.0, 1.5, 67.14, 162.32], [8.123, 10.4, 7.68, 1.6,0.7, 2.3, 21.2, 175.2]])

示例条件:

Criteria #1: 
   condition 1 : column 1 must be greater than 6 and less than 7
   condition 2 : column 4 must be greater than 0 and less than 2
   condition 3 : column 6 must be greater than 10 and less than 50
   (conditions are 'and' operation, so all conditions must be met for criteria to be met or not)
Criteria #2: 
   condition 1 : column 3 must be greater than 10 and less than 22
   condition 2 : column 4 must be greater than 9 and less than 15 

我在想numpy 在这方面是否支持某种正则表达式。 numpy 中是否有任何机制或技术可以有效地促进这一点?

上面的例子很简单,但在实际应用中,矩阵会包含数百行,每行可能有数十个条件来评估。

【问题讨论】:

  • (myData[:,0}>6)&(myData[:,0]<7) 创建一个一维布尔数组,每行一个元素(全部为 False!)。对于其他列测试也是如此。
  • 几百行在任何现代机器上都是很小的。

标签: python python-3.x performance numpy


【解决方案1】:

第一个选项:简单的矢量化比较:

c1 = (data[:, 0] > 6) & (data[:, 0] < 7) & (data[:, 3] > 0) & (data[:, 3] < 2) & (data[:, 5] > 10) & (data[:, 5] < 50)

c1 是行触发条件 1 的位置的布尔掩码。您可以将其用作data 的第一个维度的索引。

第二个选项:提取感兴趣的列并同时与上限和下限标准进行比较:

c1lower = [6, 0, 10]
c1upper = [7, 2, 50]
c1cols = data[:, [0, 3, 5]] # this is a copy
c1 = ((c1cols > c1lower) & (c1cols < c1upper)).all(1)

复制数据可能会更慢,但跨行合并数据应该更快。

在这两种情况下,您都可以使用np.where、np.nonzero、np.flatnonzero 或np.argwhere 将布尔掩码转换为数字索引。

【讨论】:

    猜你喜欢
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多