I have a 2D numpy array S representing a state space, with 80000000 rows (as states) and 5 columns (as state variables).
I initialize K0 with S, and at each iteration, I apply a state transition function f(x) on all of the states in Ki, and delete states whose f(x) is not in Ki, resulting Ki+1. Until it converges i.e. Ki+1 = Ki.
Going like this would take ages:
K = S
to_delete = 
to_delete = 
for i in xrange(len(K)):
if not f(i) in K:
K = delete(K,to_delete,0)
Your question is difficult to understand because it contains extraneous information and contains typos. If I understand correctly, you simply want an efficient way to perform a set operation on the rows of a 2D array (in this case the intersection of the rows of
if this is
In : k Out: array([[6, 6], [3, 7], [7, 5], [7, 3], [1, 3], [1, 5], [7, 6], [3, 8], [6, 1], [6, 0]])
and this is
f(K) (for this example I subtract 1 from the first col and add 1 to the second):
In : k2 Out: array([[5, 7], [2, 8], [6, 6], [6, 4], [0, 4], [0, 6], [6, 7], [2, 9], [5, 2], [5, 1]])
then you can find all rows in
K also found in
f(K) by doing something this:
In : k[np.in1d(k.view(dtype='i,i').reshape(k.shape),k2.view(dtype='i,i'). reshape(k2.shape))] Out: array([[6, 6]])
reshape create flat structured views so that each row appears as a single element to
in1d creates a boolean index of
k of matched items which is used to fancy index
k and return the filtered array.