471 lines
15 KiB
Python
471 lines
15 KiB
Python
import scisoftpy as np
|
|
################################################################################
|
|
# Arrays
|
|
################################################################################
|
|
a =np.array([1, 2, 3]) # Create a rank 1 array
|
|
print(type(a)) # Prints "<class 'numpy.ndarray'>"
|
|
print(a.shape) # Prints "(3,)"
|
|
print(a[0], a[1], a[2]) # Prints "1 2 3"
|
|
a[0] = 5 # Change an element of the array
|
|
print(a) # Prints "[5, 2, 3]"
|
|
|
|
b = np.array([[1,2,3],[4,5,6]]) # Create a rank 2 array
|
|
print(b.shape) # Prints "(2, 3)"
|
|
print(b[0, 0], b[0, 1], b[1, 0]) # Prints "1 2 4"
|
|
|
|
|
|
a = np.zeros((2,2)) # Create an array of all zeros
|
|
print(a) # Prints "[[ 0. 0.]
|
|
# [ 0. 0.]]"
|
|
|
|
b = np.ones((1,2)) # Create an array of all ones
|
|
print(b) # Prints "[[ 1. 1.]]"
|
|
|
|
c = np.full((2,2), 7) # Create a constant array
|
|
print(c) # Prints "[[ 7. 7.]
|
|
# [ 7. 7.]]"
|
|
|
|
d = np.eye(2) # Create a 2x2 identity matrix
|
|
print(d) # Prints "[[ 1. 0.]
|
|
# [ 0. 1.]]"
|
|
|
|
###TODO: not present
|
|
#e = np.random.random((2,2)) # Create an array filled with random values
|
|
#print(e) # Might print "[[ 0.91940167 0.08143941]
|
|
# [ 0.68744134 0.87236687]]"
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
# Array slicing
|
|
################################################################################
|
|
|
|
# Create the following rank 2 array with shape (3, 4)
|
|
# [[ 1 2 3 4]
|
|
# [ 5 6 7 8]
|
|
# [ 9 10 11 12]]
|
|
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
|
|
|
|
# Use slicing to pull out the subarray consisting of the first 2 rows
|
|
# and columns 1 and 2; b is the following array of shape (2, 2):
|
|
# [[2 3]
|
|
# [6 7]]
|
|
b = a[:2, 1:3]
|
|
|
|
# A slice of an array is a view into the same data, so modifying it
|
|
# will modify the original array.
|
|
print(a[0, 1]) # Prints "2"
|
|
b[0, 0] = 77 # b[0, 0] is the same piece of data as a[0, 1]
|
|
print(a[0, 1]) # Prints "77"
|
|
|
|
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
|
|
|
|
# Two ways of accessing the data in the middle row of the array.
|
|
# Mixing integer indexing with slices yields an array of lower rank,
|
|
# while using only slices yields an array of the same rank as the
|
|
# original array:
|
|
row_r1 = a[1, :] # Rank 1 view of the second row of a
|
|
row_r2 = a[1:2, :] # Rank 2 view of the second row of a
|
|
print(row_r1, row_r1.shape) # Prints "[5 6 7 8] (4,)"
|
|
print(row_r2, row_r2.shape) # Prints "[[5 6 7 8]] (1, 4)"
|
|
|
|
# We can make the same distinction when accessing columns of an array:
|
|
col_r1 = a[:, 1]
|
|
col_r2 = a[:, 1:2]
|
|
print(col_r1, col_r1.shape) # Prints "[ 2 6 10] (3,)"
|
|
print(col_r2, col_r2.shape) # Prints "[[ 2]
|
|
# [ 6]
|
|
# [10]] (3, 1)"
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
# Integer Array indexing
|
|
################################################################################
|
|
|
|
a = np.array([[1,2], [3, 4], [5, 6]])
|
|
|
|
# An example of integer array indexing.
|
|
# The returned array will have shape (3,) and
|
|
print(a[[0, 1, 2], [0, 1, 0]]) # Prints "[1 4 5]"
|
|
|
|
# The above example of integer array indexing is equivalent to this:
|
|
print(np.array([a[0, 0], a[1, 1], a[2, 0]])) # Prints "[1 4 5]"
|
|
|
|
# When using integer array indexing, you can reuse the same
|
|
# element from the source array:
|
|
print(a[[0, 0], [1, 1]]) # Prints "[2 2]"
|
|
|
|
# Equivalent to the previous integer array indexing example
|
|
print(np.array([a[0, 1], a[0, 1]])) # Prints "[2 2]"
|
|
|
|
|
|
|
|
# Create a new array from which we will select elements
|
|
a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
|
|
|
|
print(a) # prints "array([[ 1, 2, 3],
|
|
# [ 4, 5, 6],
|
|
# [ 7, 8, 9],
|
|
# [10, 11, 12]])"
|
|
|
|
# Create an array of indices
|
|
b = np.array([0, 2, 0, 1])
|
|
|
|
# Select one element from each row of a using the indices in b
|
|
print(a[np.arange(4), b]) # Prints "[ 1 6 7 11]"
|
|
|
|
# Mutate one element from each row of a using the indices in b
|
|
a[np.arange(4), b] += 10
|
|
|
|
print(a) # prints "array([[11, 2, 3],
|
|
# [ 4, 5, 16],
|
|
# [17, 8, 9],
|
|
# [10, 21, 12]])
|
|
|
|
|
|
|
|
################################################################################
|
|
# Boolean Array indexing
|
|
################################################################################
|
|
|
|
a = np.array([[1,2], [3, 4], [5, 6]])
|
|
|
|
bool_idx = (a > 2) # Find the elements of a that are bigger than 2;
|
|
# this returns a numpy array of Booleans of the same
|
|
# shape as a, where each slot of bool_idx tells
|
|
# whether that element of a is > 2.
|
|
|
|
print(bool_idx) # Prints "[[False False]
|
|
# [ True True]
|
|
# [ True True]]"
|
|
|
|
# We use boolean array indexing to construct a rank 1 array
|
|
# consisting of the elements of a corresponding to the True values
|
|
# of bool_idx
|
|
print(a[bool_idx]) # Prints "[3 4 5 6]"
|
|
|
|
# We can do all of the above in a single concise statement:
|
|
print(a[a > 2]) # Prints "[3 4 5 6]"
|
|
|
|
|
|
|
|
################################################################################
|
|
# Data types
|
|
################################################################################
|
|
|
|
x = np.array([1, 2]) # Let numpy choose the datatype
|
|
print(x.dtype) # Prints "int64"
|
|
|
|
x = np.array([1.0, 2.0]) # Let numpy choose the datatype
|
|
print(x.dtype) # Prints "float64"
|
|
|
|
x = np.array([1, 2], dtype=np.int64) # Force a particular datatype
|
|
print(x.dtype) # Prints "int64"
|
|
|
|
|
|
################################################################################
|
|
# Array math
|
|
################################################################################
|
|
|
|
x = np.array([[1,2],[3,4]], dtype=np.float64)
|
|
y = np.array([[5,6],[7,8]], dtype=np.float64)
|
|
|
|
# Elementwise sum; both produce the array
|
|
# [[ 6.0 8.0]
|
|
# [10.0 12.0]]
|
|
print(x + y)
|
|
print(np.add(x, y))
|
|
|
|
# Elementwise difference; both produce the array
|
|
# [[-4.0 -4.0]
|
|
# [-4.0 -4.0]]
|
|
print(x - y)
|
|
print(np.subtract(x, y))
|
|
|
|
# Elementwise product; both produce the array
|
|
# [[ 5.0 12.0]
|
|
# [21.0 32.0]]
|
|
print(x * y)
|
|
print(np.multiply(x, y))
|
|
|
|
# Elementwise division; both produce the array
|
|
# [[ 0.2 0.33333333]
|
|
# [ 0.42857143 0.5 ]]
|
|
print(x / y)
|
|
print(np.divide(x, y))
|
|
|
|
# Elementwise square root; produces the array
|
|
# [[ 1. 1.41421356]
|
|
# [ 1.73205081 2. ]]
|
|
print(np.sqrt(x))
|
|
|
|
|
|
x = np.array([[1,2],[3,4]])
|
|
y = np.array([[5,6],[7,8]])
|
|
|
|
v = np.array([9,10])
|
|
w = np.array([11, 12])
|
|
|
|
# Inner product of vectors; both produce 219
|
|
###TODO: not defined print(v.dot(w))
|
|
print(np.dot(v, w))
|
|
|
|
# Matrix / vector product; both produce the rank 1 array [29 67]
|
|
###TODO: not defined print(x.dot(v))
|
|
print(np.dot(x, v))
|
|
|
|
# Matrix / matrix product; both produce the rank 2 array
|
|
# [[19 22]
|
|
# [43 50]]
|
|
###TODO: not defined print(x.dot(y))
|
|
print(np.dot(x, y))
|
|
|
|
|
|
x = np.array([[1,2],[3,4]])
|
|
|
|
print(np.sum(x)) # Compute sum of all elements; prints "10"
|
|
print(np.sum(x, axis=0)) # Compute sum of each column; prints "[4 6]"
|
|
print(np.sum(x, axis=1)) # Compute sum of each row; prints "[3 7]"
|
|
|
|
|
|
|
|
x = np.array([[1,2],[3,4]])
|
|
|
|
print(np.sum(x)) # Compute sum of all elements; prints "10"
|
|
print(np.sum(x, axis=0)) # Compute sum of each column; prints "[4 6]"
|
|
print(np.sum(x, axis=1)) # Compute sum of each row; prints "[3 7]"
|
|
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
# Broadcasting
|
|
################################################################################
|
|
|
|
# We will add the vector v to each row of the matrix x,
|
|
# storing the result in the matrix y
|
|
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
|
|
v = np.array([1, 0, 1])
|
|
y = np.empty_like(x) # Create an empty matrix with the same shape as x
|
|
|
|
# Add the vector v to each row of the matrix x with an explicit loop
|
|
for i in range(4):
|
|
y[i, :] = x[i, :] + v
|
|
|
|
# Now y is the following
|
|
# [[ 2 2 4]
|
|
# [ 5 5 7]
|
|
# [ 8 8 10]
|
|
# [11 11 13]]
|
|
print(y)
|
|
|
|
|
|
|
|
# We will add the vector v to each row of the matrix x,
|
|
# storing the result in the matrix y
|
|
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
|
|
v = np.array([1, 0, 1])
|
|
y = np.empty_like(x) # Create an empty matrix with the same shape as x
|
|
|
|
# Add the vector v to each row of the matrix x with an explicit loop
|
|
for i in range(4):
|
|
y[i, :] = x[i, :] + v
|
|
|
|
# Now y is the following
|
|
# [[ 2 2 4]
|
|
# [ 5 5 7]
|
|
# [ 8 8 10]
|
|
# [11 11 13]]
|
|
print(y)
|
|
|
|
|
|
# We will add the vector v to each row of the matrix x,
|
|
# storing the result in the matrix y
|
|
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
|
|
v = np.array([1, 0, 1])
|
|
y = np.empty_like(x) # Create an empty matrix with the same shape as x
|
|
|
|
# Add the vector v to each row of the matrix x with an explicit loop
|
|
for i in range(4):
|
|
y[i, :] = x[i, :] + v
|
|
|
|
# Now y is the following
|
|
# [[ 2 2 4]
|
|
# [ 5 5 7]
|
|
# [ 8 8 10]
|
|
# [11 11 13]]
|
|
print(y)
|
|
|
|
|
|
|
|
# We will add the vector v to each row of the matrix x,
|
|
# storing the result in the matrix y
|
|
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
|
|
v = np.array([1, 0, 1])
|
|
y = np.empty_like(x) # Create an empty matrix with the same shape as x
|
|
|
|
# Add the vector v to each row of the matrix x with an explicit loop
|
|
for i in range(4):
|
|
y[i, :] = x[i, :] + v
|
|
|
|
# Now y is the following
|
|
# [[ 2 2 4]
|
|
# [ 5 5 7]
|
|
# [ 8 8 10]
|
|
# [11 11 13]]
|
|
print(y)
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
# Polynomial
|
|
################################################################################
|
|
|
|
p = np.poly1d([1, 2, 3])
|
|
|
|
print p(0.5) #4.25
|
|
#Roots
|
|
print p.r #([-1.+1.41421356j, -1.-1.41421356j])
|
|
print p(p.r)
|
|
|
|
|
|
#Show the coefficients:
|
|
print p.c #array([1, 2, 3])
|
|
|
|
#Display the order (the leading zero-coefficients are removed):
|
|
print p.order #2
|
|
#Show the coefficient of the k-th power in the polynomial (which is equivalent to p.c[-(i+1)]):
|
|
|
|
print p[1] #2
|
|
#Polynomials can be added, subtracted, multiplied, and divided (returns quotient and remainder):
|
|
|
|
###TODO: Not supported
|
|
#print p * p #poly1d([ 1, 4, 10, 12, 9])
|
|
#print (p**3 + 4) / p #(poly1d([ 1., 4., 10., 12., 9.]), poly1d([4.]))
|
|
#asarray(p) gives the coefficient array, so polynomials can be used in all functions that accept arrays:
|
|
#print np.square(p) # square of individual coefficients array([1, 4, 9])
|
|
|
|
#print p**2 # square of polynomial
|
|
print np.poly1d([ 1, 4, 10, 12, 9])
|
|
|
|
#The variable used in the string representation of p can be modified, using the variable parameter:
|
|
|
|
p = np.poly1d([1,2,3], variable='z')
|
|
print(p) # 2
|
|
# 1 z + 2 z + 3
|
|
#Construct a polynomial from its roots:
|
|
print np.poly1d([1, 2], True) #poly1d([ 1., -3., 2.])
|
|
|
|
###TODO: Not supported
|
|
#This is the same polynomial as obtained by:
|
|
#print np.poly1d([1, -1]) * np.poly1d([1, -2])
|
|
|
|
|
|
|
|
coeff = [3.2, 2, 1]
|
|
print np.roots(coeff) #array([-0.3125+0.46351241j, -0.3125-0.46351241j])
|
|
|
|
################################################################################
|
|
# Fit
|
|
################################################################################
|
|
|
|
|
|
x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])
|
|
y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
|
|
z = np.fit.polyfit(x, y, 3)
|
|
print z #array([ 0.08703704, -0.81349206, 1.69312169, -0.03968254]) # may vary
|
|
|
|
p = np.poly1d(z)
|
|
p(0.5) #0.6143849206349179
|
|
|
|
|
|
################################################################################
|
|
# Convolution
|
|
################################################################################
|
|
#Note how the convolution operator flips the second array before “sliding” the two across one another:
|
|
print np.convolve([1, 2, 3], [0, 1, 0.5]) #array([0. , 1. , 2.5, 4. , 1.5])
|
|
|
|
#Only return the middle values of the convolution. Contains boundary effects, where zeros are taken into account:
|
|
print np.convolve([1,2,3],[0,1,0.5], 'same') #array([1. , 2.5, 4. ])
|
|
|
|
#The two arrays are of the same length, so there is only one position where they completely overlap:
|
|
print np.convolve([1,2,3],[0,1,0.5], 'valid') #array([2.5])
|
|
|
|
|
|
|
|
print np.correlate([1, 2, 3], [0, 1, 0.5]) #array([3.5])
|
|
print np.correlate([1, 2, 3], [0, 1, 0.5], "same") #array([2. , 3.5, 3. ])
|
|
print np.correlate([1, 2, 3], [0, 1, 0.5], "full") #array([0.5, 2. , 3.5, 3. , 0. ])
|
|
|
|
###TODO: Not supported
|
|
#Using complex sequences:
|
|
#print np.correlate([1+1j, 2, 3-1j], [0, 1, 0.5j], 'full') #array([ 0.5-0.5j, 1.0+0.j , 1.5-1.5j, 3.0-1.j , 0.0+0.j ])
|
|
#Note that you get the time reversed, complex conjugated result when the two input sequences change places, i.e., c_{va}[k] = c^{*}_{av}[-k]:
|
|
#print np.correlate([0, 1, 0.5j], [1+1j, 2, 3-1j], 'full') #array([ 0.0+0.j , 3.0+1.j , 1.5+1.5j, 1.0+0.j , 0.5+0.5j])
|
|
|
|
|
|
################################################################################
|
|
# FFT
|
|
################################################################################
|
|
|
|
print np.fft.fft(np.exp(2j * np.pi * np.arange(8) / 8))
|
|
"""
|
|
array([-2.33486982e-16+1.14423775e-17j, 8.00000000e+00-1.25557246e-15j,
|
|
2.33486982e-16+2.33486982e-16j, 0.00000000e+00+1.22464680e-16j,
|
|
-1.14423775e-17+2.33486982e-16j, 0.00000000e+00+5.20784380e-16j,
|
|
1.14423775e-17+1.14423775e-17j, 0.00000000e+00+1.22464680e-16j])
|
|
"""
|
|
|
|
###TODO: mgrid supported
|
|
#a = np.mgrid[:5, :5][0]
|
|
a = np.array([[0, 0, 0, 0, 0],
|
|
[1, 1, 1, 1, 1],
|
|
[2, 2, 2, 2, 2],
|
|
[3, 3, 3, 3, 3],
|
|
[4, 4, 4, 4, 4]], dtype=np.float64)
|
|
print np.fft.fft2(a)
|
|
"""
|
|
array([[ 50. +0.j , 0. +0.j , 0. +0.j , # may vary
|
|
0. +0.j , 0. +0.j ],
|
|
[-12.5+17.20477401j, 0. +0.j , 0. +0.j ,
|
|
0. +0.j , 0. +0.j ],
|
|
[-12.5 +4.0614962j , 0. +0.j , 0. +0.j ,
|
|
0. +0.j , 0. +0.j ],
|
|
[-12.5 -4.0614962j , 0. +0.j , 0. +0.j ,
|
|
0. +0.j , 0. +0.j ],
|
|
[-12.5-17.20477401j, 0. +0.j , 0. +0.j ,
|
|
0. +0.j , 0. +0.j ]])
|
|
"""
|
|
|
|
###TODO: must be array of dubles
|
|
#print np.fft.ifft([0, 4, 0, 0])
|
|
print np.fft.ifft([0.0, 4.0, 0.0, 0.0]) #array([ 1.+0.j, 0.+1.j, -1.+0.j, 0.-1.j]) # may vary
|
|
|
|
|
|
|
|
a = 4 * np.eye(4)
|
|
print np.fft.ifft2(a)
|
|
|
|
"""
|
|
array([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], # may vary
|
|
[0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
|
|
[0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
|
|
[0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]])
|
|
"""
|
|
|
|
|
|
################################################################################
|
|
# Plot
|
|
################################################################################
|
|
plot(a.tolist())
|
|
plot(Convert.reshape(a.data,(4,4)))
|
|
|
|
|
|
|
|
print "DONE"
|