我有一个代表状态空间的 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]]
最佳答案
您的问题很难理解,因为它包含无关信息和拼写错误。如果我理解正确的话,你只是想要一种有效的方法来对二维数组的行执行集合操作(在这种情况下 K
和 f(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]])
view
和 reshape
创建平面结构化 View ,以便每一行显示为 in1d
的单个元素。 in1d
创建一个包含 k
的匹配项的 bool 索引,用于计算索引 k
并返回过滤后的数组。
关于python - 二维数组的 numpy in1d 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16210738/