# generating two orthogonal vectors that are orthogonal to a particular direction

Physicist

What is the simplest and most efficient ways in numpy to generate two orthonormal vectors a and b such that the cross product of the two vectors equals another unit vector k, which is already known?

I know there are infinitely many such pairs, and it doesn't matter to me which pairs I get as long as the conditions axb=k and a.b=0 are satisfied.

This will do:

``````>>> k  # an arbitrary unit vector k is not array. k is must be numpy class. np.array
np.array([ 0.59500984,  0.09655469, -0.79789754])
``````

To obtain the 1st one:

``````>>> x = np.random.randn(3)  # take a random vector
>>> x -= x.dot(k) * k       # make it orthogonal to k
>>> x /= np.linalg.norm(x)  # normalize it
``````

To obtain the 2nd one:

``````>>> y = np.cross(k, x)      # cross product with k
``````

and to verify:

``````>>> np.linalg.norm(x), np.linalg.norm(y)
(1.0, 1.0)
>>> np.cross(x, y)          # same as k
array([ 0.59500984,  0.09655469, -0.79789754])
>>> np.dot(x, y)            # and they are orthogonal
-1.3877787807814457e-17
>>> np.dot(x, k)
-1.1102230246251565e-16
>>> np.dot(y, k)
0.0
``````

Collected from the Internet

edited at

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev

From Dev