import numpy as np
def run():
# create a column vector
col_vec = np.array([[1], [2]])
print "column vector"
print col_vec
# create a row vector
row_vec = np.array([[1, 2]])
print "row vector"
print row_vec
# create a matrix
mat = np.array([[1, 2], [3, 4]])
print "matrix"
print mat
# inspect dimensions
print "row vector dimensions", row_vec.ndim
shape = row_vec.shape
print "row vector rows", shape[0], "columns", shape[1]
print "matrix dimensions", mat.ndim
shape = mat.shape
print "matrix rows", shape[0], "columns", shape[1]
# transpose
vec_t = row_vec.transpose() # or row_vec.T
print "transposed vector"
print vec_t
mat_t = mat.transpose() # or mat.T
print "transposed matrix"
print mat_t
a = np.array([[2], [-4], [1]])
b = np.array([[2], [1], [-2]])
# addition
print "a + b"
print a + b
# subtraction
print "a - b"
print a - b
# scalar multiplication
print "1.2 * a"
print 1.2 * a
# element wise multiplication
print "a * b"
print a * b
# vector scalar product
print "a . b"
print np.dot(a.transpose(), b)
# vector cross product
print "a x b"
print np.cross(a, b, axis=0) # or np.cross(a.T, b.T).T
identity = np.array([[1, 0], [0, 1]])
# matrix vector product
print "identity . col_vec"
print np.dot(identity, col_vec)
# matrix product
print "identity . mat"
print np.dot(identity, mat)
aW1wb3J0IG51bXB5IGFzIG5wCgpkZWYgcnVuKCk6CiAgICAjIGNyZWF0ZSBhIGNvbHVtbiB2ZWN0b3IKICAgIGNvbF92ZWMgPSBucC5hcnJheShbWzFdLCBbMl1dKQogICAgcHJpbnQgImNvbHVtbiB2ZWN0b3IiCiAgICBwcmludCBjb2xfdmVjCiAgICAKICAgICMgY3JlYXRlIGEgcm93IHZlY3RvcgogICAgcm93X3ZlYyA9IG5wLmFycmF5KFtbMSwgMl1dKQogICAgcHJpbnQgInJvdyB2ZWN0b3IiCiAgICBwcmludCByb3dfdmVjCiAgICAKICAgICMgY3JlYXRlIGEgbWF0cml4CiAgICBtYXQgPSBucC5hcnJheShbWzEsIDJdLCBbMywgNF1dKQogICAgcHJpbnQgIm1hdHJpeCIKICAgIHByaW50IG1hdAogICAgCiAgICAjIGluc3BlY3QgZGltZW5zaW9ucwogICAgcHJpbnQgInJvdyB2ZWN0b3IgZGltZW5zaW9ucyIsIHJvd192ZWMubmRpbQogICAgc2hhcGUgPSByb3dfdmVjLnNoYXBlCiAgICBwcmludCAicm93IHZlY3RvciByb3dzIiwgc2hhcGVbMF0sICJjb2x1bW5zIiwgc2hhcGVbMV0KICAgIAogICAgcHJpbnQgIm1hdHJpeCBkaW1lbnNpb25zIiwgbWF0Lm5kaW0KICAgIHNoYXBlID0gbWF0LnNoYXBlCiAgICBwcmludCAibWF0cml4IHJvd3MiLCBzaGFwZVswXSwgImNvbHVtbnMiLCBzaGFwZVsxXQogICAgCiAgICAjIHRyYW5zcG9zZQogICAgdmVjX3QgPSByb3dfdmVjLnRyYW5zcG9zZSgpICMgb3Igcm93X3ZlYy5UCiAgICBwcmludCAidHJhbnNwb3NlZCB2ZWN0b3IiCiAgICBwcmludCB2ZWNfdAogICAgCiAgICBtYXRfdCA9IG1hdC50cmFuc3Bvc2UoKSAjIG9yIG1hdC5UCiAgICBwcmludCAidHJhbnNwb3NlZCBtYXRyaXgiCiAgICBwcmludCBtYXRfdAogICAgCiAgICBhID0gbnAuYXJyYXkoW1syXSwgWy00XSwgWzFdXSkKICAgIGIgPSBucC5hcnJheShbWzJdLCBbMV0sIFstMl1dKQogICAgCiAgICAjIGFkZGl0aW9uIAogICAgcHJpbnQgImEgKyBiIgogICAgcHJpbnQgYSArIGIKICAgIAogICAgIyBzdWJ0cmFjdGlvbgogICAgcHJpbnQgImEgLSBiIgogICAgcHJpbnQgYSAtIGIKICAgIAogICAgIyBzY2FsYXIgbXVsdGlwbGljYXRpb24KICAgIHByaW50ICIxLjIgKiBhIgogICAgcHJpbnQgMS4yICogYQogICAgCiAgICAjIGVsZW1lbnQgd2lzZSBtdWx0aXBsaWNhdGlvbgogICAgcHJpbnQgImEgKiBiIgogICAgcHJpbnQgYSAqIGIgICAgCiAgICAKICAgICMgdmVjdG9yIHNjYWxhciBwcm9kdWN0CiAgICBwcmludCAiYSAuIGIiCiAgICBwcmludCBucC5kb3QoYS50cmFuc3Bvc2UoKSwgYikKICAgIAogICAgIyB2ZWN0b3IgY3Jvc3MgcHJvZHVjdAogICAgcHJpbnQgImEgeCBiIgogICAgcHJpbnQgbnAuY3Jvc3MoYSwgYiwgYXhpcz0wKSAjIG9yIG5wLmNyb3NzKGEuVCwgYi5UKS5UCiAgICAKICAgIGlkZW50aXR5ID0gbnAuYXJyYXkoW1sxLCAwXSwgWzAsIDFdXSkKICAgIAogICAgIyBtYXRyaXggdmVjdG9yIHByb2R1Y3QKICAgIHByaW50ICJpZGVudGl0eSAuIGNvbF92ZWMiCiAgICBwcmludCBucC5kb3QoaWRlbnRpdHksIGNvbF92ZWMpCiAgICAKICAgICMgbWF0cml4IHByb2R1Y3QKICAgIHByaW50ICJpZGVudGl0eSAuIG1hdCIKICAgIHByaW50IG5wLmRvdChpZGVudGl0eSwgbWF0KQogICAgCiAgICAK