def de_mean_matrix(A):
	"""returns the result of subtracting from every value in A
	the mean value of its column. the resulting matrix has mean 0
	in every column"""
	nr, nc = shape(A)
	column_means, _ = scale(A)
	return make_matrix(nr, nc, lambda i, j: A[i][j] - column_means[j])
def scale(data_matrix):
	"""returns the means and standard deviations of each column"""
	num_rows, num_cols = shape(data_matrix)
	means = [mean(get_column(data_matrix, j)) for j in range(num_cols)]
	stdevs = [standard_deviation(get_column(data_matrix, j)) for j in range(num_cols)]

	return means, stdevs
def rescale(data_matrix):
	"""rescales the input data so that each column has mean 0
	and standard deviation 1, leaves columns alone with no
	deviations"""
	means, stdevs = scale(data_matrix)

	def rescaled(i, j):
		if stdevs[j] > 0:
			return (data_matrix[i][j] - means[j]) / stdevs[j]
		else:
			return data_matrix[i][j]

	num_rows, num_cols = shape(data_matrix)
	return make_matrix(num_rows, num_cols, rescaled)