python - 二维数组的 numpy in1d 实现?

标签 python numpy

我有一个代表状态空间的 2D numpy 数组 S,有 80000000 行(作为状态)和 5 列(作为状态变量)。

我用 S 初始化 K0,在每次迭代中,我对 Ki 中的所有状态应用状态转换函数 f(x),并删除 f(x) 不在 Ki 中的状态,得到 Ki+1。直到收敛,即 Ki+1 = Ki。

这样做会花费很长时间:

K = S
to_delete = [0]
While to_delete:
    to_delete = []
    for i in xrange(len(K)):
        if not f(i) in K:
        to_delete.append(K(i))
    K = delete(K,to_delete,0)

所以我想做一个向量化的实现:

在列中切片 K,应用 f 并再次连接它们,从而以某种方式获得 f(K)。

现在的问题是如何得到一个长度为 len(K) 的数组,比如 Sel,其中每一行 Sel[i] 确定 f(K[i]) 是否在 K 中。就像函数 in1d 一样工作。

那么制作起来就简单了

K=K[Sel]]

最佳答案

您的问题很难理解,因为它包含无关信息和拼写错误。如果我理解正确的话,你只是想要一种有效的方法来对二维数组的行执行集合操作(​​在这种情况下 Kf(K))。

您可以使用 numpy.in1d 执行此操作如果你创建 structured array查看。

代码:

如果这是K:

In [50]: k
Out[50]:
array([[6, 6],
       [3, 7],
       [7, 5],
       [7, 3],
       [1, 3],
       [1, 5],
       [7, 6],
       [3, 8],
       [6, 1],
       [6, 0]])

这是 f(K)(在这个例子中,我从第一个列减去 1,第二个列加 1):

In [51]: k2
Out[51]:
array([[5, 7],
       [2, 8],
       [6, 6],
       [6, 4],
       [0, 4],
       [0, 6],
       [6, 7],
       [2, 9],
       [5, 2],
       [5, 1]])

然后您可以通过执行以下操作找到 K 中的所有行也可以在 f(K) 中找到:

In [55]: k[np.in1d(k.view(dtype='i,i').reshape(k.shape[0]),k2.view(dtype='i,i').
reshape(k2.shape[0]))]
Out[55]: array([[6, 6]])

viewreshape 创建平面结构化 View ,以便每一行显示为 in1d 的单个元素。 in1d 创建一个包含 k 的匹配项的 bool 索引,用于计算索引 k 并返回过滤后的数组。

关于python - 二维数组的 numpy in1d 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16210738/

相关文章:

python - 将键值对解析为 DataFrame 列

python - 在 Django 表单发布请求中访问单选/复选框按钮选择

python - Numpy.dot 类型错误 : Cannot cast array data from dtype ('float64' ) to dtype ('S32' ) according to the rule 'safe'

python - 如何最有效、最安全地模拟 Python shell?

python - 比较 bool 系列

python - Numerical Python - 我如何使它成为一个 ufunc?

python - Django 没有反射(reflect) urls.py 的更改

python - 比较 int 变量

python - 为 Python + 一组依赖项创建 Windows 安装程序

python - 为什么 len 在 DataFrame 上比在底层 numpy 数组上效率高得多?