As others have already commented: Yes (py)OpenCl is the "perfect" tool for this job.
I'll suggest having a look at the examples to get a feeling how everything works.
https://github.com/pyopencl/pyopencl/blob/master/examples
Also this slides from the pyOpenCL author are a nice read.
A short example (without imports and added comments from here)
# Create some random test data
a_np = np.random.rand(50000).astype(np.float32)
b_np = np.random.rand(50000).astype(np.float32)
# Select a device
ctx = cl.create_some_context(interactive=True)
queue = cl.CommandQueue(ctx)
# Allocate memory on the device and copy the content of our numpy array
mf = cl.mem_flags
a_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a_np)
b_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b_np)
# The code running on your device
prg = cl.Program(ctx, """
__kernel void sum(
__global const float *a_g, __global const float *b_g, __global float *res_g)
{
int gid = get_global_id(0);
res_g[gid] = a_g[gid] + b_g[gid];
}
""").build()
# Allocate the output buffer on the device
res_g = cl.Buffer(ctx, mf.WRITE_ONLY, a_np.nbytes)
# and call the above defined kernel
prg.sum(queue, a_np.shape, None, a_g, b_g, res_g)
# Create a numpy array for the results and copy them from the device
res_np = np.empty_like(a_np)
cl.enqueue_copy(queue, res_np, res_g)