You can get a texture “as data” with tex.get_ram_image() (which returns an object that you can construct a memoryview() from) and set it with tex.set_ram_image(data).
The order is BGRA, so if you want to get it as a different component ordering you can use tex.get_ram_image_as("RGBA"), same for set_ram_image_as, though it’ll be a bit less efficient.
This is the best way to get textures between numpy/PIL and Panda3D.
The simplest way might be to apply it as a texture to a quad/card.
Something like this:
# Presume that you've converted your numpy array into a texture,
# and stored that texture in a variable called 'myTex"
from panda3d.core import CardMaker
cardMaker = CardMaker("card maker")
card = cardMaker.generate()
card.setTexture(myTex)
card.reparentTo(render)
# Note: Don't forget to place the camera or card such that
# the camera can see the card!