我有一个表示状态空间的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数组的行(在这种情况下为K
和f(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]])
view
和reshape
创建平面结构化 View ,以便每一行都显示为in1d
的单个元素。 in1d
创建匹配项的k
的 bool 索引,该索引用于查找k
的索引并返回过滤后的数组。关于python - 为2D数组实现numpy in1d?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16210738/