
# numpyTests.py
# https://numpy.org/
'''
  A version of this code is executed by JEP inside
  JepNumpy.java

  The examples include:
    * maximums
    * means
    * products
    * sorting
    * array resizing 
    * generating a checkboard
'''

import numpy as np


print("------ Maximums --------------")

# Creating 5x4 array
array = np.arange(20).reshape(5, 4)
print(array)
print()

# If no axis mentioned, then it works on the entire array
print(np.argmax(array))

# If axis=1, then it works on each row
print(np.argmax(array, axis=1))

# If axis=0, then it works on each column
print(np.argmax(array, axis=0))



print("---------- Means --------------")

list = [
    np.array([3, 2, 8, 9]),
    np.array([4, 12, 34, 25, 78]),
    np.array([23, 12, 67])
]

result = []
for i in range(len(list)):
    result.append(np.mean(list[i]))
print(result)


print("---------- Products --------------")

matrix1 = [
    [3, 4, 2],
    [5, 1, 8],
    [3, 1, 9]
]

matrix2 = [
    [3, 7, 5],
    [2, 9, 8],
    [1, 5, 8]
]

result = np.dot(matrix1, matrix2)
print(result)


print("---------- reverse --------------")

array = np.array([3, 6, 7, 2, 5, 1, 8])
reversedArray = np.flipud(array)
print(reversedArray)


print("---------- sorting --------------")

array = np.array([
    [3, 7, 1],
    [10, 3, 2],
    [5, 6, 7]
])
print(array)
print()

# Sort the whole array
print('No axis:',np.sort(array, axis=None))
print()

# Sort along each row
print('Row:\n', np.sort(array, axis=1))
print()

# Sort along each column
print('Column:\n', np.sort(array, axis=0))

print("---------\n")

array = np.array([28, 13, 45, 12, 4, 8, 0])
print(array)
print()

# returns the indices that would sort an array.
print(np.argsort(array))


print("---------- add row/column --------------")

array = np.array([
    [3, 2, 8],
    [4, 12, 34],
    [23, 12, 67]
])

newRow = np.array([2, 1, 8])
newArray = np.vstack((array, newRow))
print(newArray)
print()

print("-------------\n")

array = np.array([
    [3, 2, 8],
    [4, 12, 34],
    [23, 12, 67]
])

newColumn = np.array([2, 1, 8])
newArray = np.column_stack((array, newColumn))
print(newArray)


print("---------- checkerboard --------------")

n = 8

# Create a nxn matrix filled with 0
matrix = np.zeros((n, n), dtype=int)

# fill 1 with alternate rows and column
matrix[::2, 1::2] = 1
matrix[1::2, ::2] = 1

# Print the checkerboard pattern
for i in range(n):
    for j in range(n):
        print(matrix[i][j], end=" ")
    print()

