我有一个表示状态空间的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]]

最佳答案

您的问题很难理解,因为它包含无关的信息并且包含错​​别字。如果我理解正确,您只是想对2D数组的行(在这种情况下为Kf(K)的行的交点)执行设置操作的有效方法。

如果创建numpy.in1d View ,则可以使用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 - 为2D数组实现numpy in1d?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16210738/

10-12 14:19