What is the best approach to let C# and Python communicate for this machine learning task?
You have a few options:
Subprocess
You can open the python script via the Unity's C# then send stdout and stdin data to and from the process. In the Python side it's as simple as input() and print(), and in the C# side it's basically reading and writing from a Stream object (as far as I remember)
UDP/TCP sockets
You can make your Python a UDP/TCP server (preferrably UDP if you have to transfer a lot of data, and it might be simpler to code). Then you create a C# client and send requests to the Python server. The python server will do the processing (AI magic, yayy!) then return the results to the Unity's C#. In C# you'd have to research the UdpClient class, and in Python, the socket module.
I'm developing a simple game for a university project using Unity. This game makes use of machine learning, so I need TensorFlow in order to build a Neural Network (NN) to accomplish certain actions in the game depending on the prediction of the NN.
In particular my learning approach is reinforcement learning. I need to monitor the states and the rewards in the environment [coded in C#], and pass them to the NN [coded in Python]. Then the prediction [from Python code] should be sent back to the environment [to C# code]. 
Sadly I'm quite confused on how to let C# and Python communicate. I'm reading a lot online but nothing really helped me. Can anybody clear my ideas? Thank you.