python 基础班练习七


习题1 在 Python 下对一个二维列表,l1=[[1,2,3],[4,5,6]],然后进行每个元素+1 的操作。 要求使用  Python 循环  Map函数  Numpy 计算(广播算法)
import numpy as np
l1 = [[1,2,3],[4,5,6]]

python 循环

def sum_1(l1):
    for i in range(len(l1)):
        for j in range(len(l1[i])):
            l1[i][j] += 1
    return l1
l2 = sum_1(l1)   

map函数

def sum_1(num):
    for i in range(len(num)):
        num[i] += 1
        print(num[i])
    return num
l2 = list(map(sum_1,l1))
print(l2)

numpy计算(广播算法)

nd1 = np.array(l1)
nd2 = nd1+1
print(nd2)


习题2 对 arr= [[1, 2, 3], [4, 5, 6], [7,8, 9], [10, 11, 12]]进行行列互转  Python 列表表达式 Numpy 进行转置
import numpy as np
arr = [[1, 2, 3], [4, 5, 6], [7,8, 9], [10, 11, 12]]

Python列表表达式

def transpose_list(l1):
    l2 = []
    for i in range(len(l1[0])):
        l3 = []
        for j in range(len(l1)):
            l3.append(l1[j][i])
        l2.append(l3)
    return l2
print(transpose_list(arr))

numpy进行转置

nd1 = np.array(arr)
nd1.T


习题3
矩阵内部运算
 在 Python 下对一个二维列表,l1=[[1,2,3],[4,5,6]],要求求出按行与按列求和。
 在 numpy 下对一个二维列表,l1=[[1,2,3],[4,5,6]],要求求出按行与按列求和。
l1=[[1,2,3],[4,5,6]]

python行与列求和

python对l1按行的求和

def sum_row(l1):
    l2 = []
    for i in range(len(l1)):
        h = 0
        for j in range(len(l1[i])):
            h +=l1[i][j]
        l2.append(h)
    return l2
print(sum_row(l1))

python对l1按列求和

def sum_column(l1):
    l2 = []
    for  i in range(len(l1[0])):
        h = 0
        for j in range(len(l1)):
            h += l1[j][i]
        l2.append(h)
    return l2
print(sum_column(l1))
 

numpy对二维数组的行列求和

nd1 = np.array(l1)
np.sum(nd1, axis=0)#去掉第一维求和:列求和
np.sum(nd1, axis=1)#去掉第二维求和:行求和


习题4 NDArray 创建与属性  使用 Numpy 创建一个多维数组,请输出以下属性  该数组的形状  该数组的维度  该数组元素的个数  该数组的数据类型
nd1 = np.arange(6)
np.random.shuffle(nd1)
nd2 = nd1.reshape(2,-1)
print(nd2)
print(nd2.shape)#数组形状
print(nd2.ndim)#数组维度
print(nd2.size)#数组元素个数
print(nd2.dtype)#数组数据类型


习题5 NDArray 的访问 创建一个包含从数字 1 到 60,的数组,并将于其形状变为为(3,2,10)的三维数组,并按如下要求访问这个三 维数组  访问第 0 维度中第二个元素的所有的信息  访问第 0 维度中所有元素的全部第 0 个维度(行),和最后一个维度(列)6-7 列  将该数组降维至二维,形状自行定义  打乱矩阵内元素的顺序  按行维度进行排序  按列维度进行排序  将降维后的数组进行行列转置  将转至后的数组展平至一维数组。
nd1 = np.arange(1,61)
np.random.shuffle(nd1)
nd2 = nd1.reshape(3,2,10)
print(nd2[[0],1])#第0个维度第二个元素
print(nd2[:,[1],[5,6]])#访问第0维度中所有元素中的第0个维度以及最后一个维度的6-7列
nd3 = nd2.reshape(15,-1)#降至二维度
np.random.shuffle(nd3)#打乱矩阵内元素顺序
print(nd3)
print(np.sort(nd3,axis=1))#按行进行排序
print(np.sort(nd3,axis=0))#按列进行排序
print(nd3.T)#将降维后的数组进行行列转置
print(nd3.flatten())#将转至后的数组展平至一维数组。


习题6
拼接与切分 NDArray 对象
 先建立两个矩阵 arr1=[[1,2,3],[4,5,6]]和 arr2=[[7,8,9],[10,11,12]]
 对两个矩阵进行横向拼接,并输出结果
 对两个矩阵进行纵向拼接,赋值给 arr3 并输出结果
 对 arr3 按列进行分割为 3 个新元素并输出
 对 arr3 按行进行分割为 2 个新元素并输出
 将 arr3 转换为 Python 列表,并指定数据类型为 int
**import numpy as np
arr1=[[1,2,3],[4,5,6]]
arr2=[[7,8,9],[10,11,12]]
print(np.hstack([arr1,arr2]))#水平拼接

print(np.c_[arr1,arr2])#水平拼接

arr3 = np.vstack([arr1,arr2])#垂直拼接
print(arr3)
a,b,c = np.hsplit(arr3,3)#分割为3个新元素
print(a,b,c)
x,y = np.vsplit(arr3,2)#分割为2个新元素
print(x,y)
arr3.dtype = 'int'
print(arr3.dtype)
l4 = arr3.tolist()#将arr3转为list
print(type(l4[0][0]))
print(type(l4))**


习题7 数据导入导出  生成一个随机数矩阵,形状为(3,5)  将其第 2 行第 4 列的元素修改为 998  保存至本地文件 random_matrix.txt  并尝试从这个文件中载入并验证修改是否正确
import numpy as np

nd1 = np.arange(1,16)
np.random.shuffle(nd1)
nd2 = nd1.reshape(3,5)
print(nd2)
nd2[[1],[3]] = 998
print(nd2.dtype)
np.savetxt('/Users/Desktop/python/课时7/练习/random_matrix.txt',nd2)
nd3 = np.loadtxt('/Users/Desktop/python/课时7/练习/random_matrix.txt')

验证保存的2行4列的值是否为998

def check_read_write(ndw):
    return True if ndw[[1],[3]] == 998 else False
print(check_read_write(nd3))


使用numpy实现softmax 思路: 计算指数,并安全处理避免数字过大
按行求和 每行均除以计算的和
import numpy as np
import sys
z  =  [9999999, 10 , 3 , 5 , 15 , 2 , 3,14.9] 
max_value = np.max(z)#最大值
def softmax(nd1):
    print(np.exp(z-max_value))
    print(np.sum(np.exp(z-max_value)))
    return np.exp(z-max_value)/ np.sum(np.exp(z-max_value))#每个元素的指数/所有元素的指数之和,
                                       #每个元素的大小映射成0-1的值(形成概率的性质)
        
exp_arr= softmax(z)#概率的数组
print(exp_arr)
max_n = np.max(exp_arr)#获取最大的概率,
np.log(max_n*np.sum(np.exp(z-max_value)))+max_value#根据概率选取到值最大的元素,

这理解好像不怎么对

股票相关统计量计算

{{{

读入的给定的ibm股价数据中的收盘价及成交量

import numpy as np

np.loadtxt

c,v = np.loadtxt('/Users/Desktop/python/课时7/课件/python-7.ibm.txt',\
              delimiter='\t',usecols=(4,6),unpack=True,skiprows=1)

计算成交量加权平均价VWAP(收盘价)

VWAP = np.average(c,weights=v)
print(VWAP)

date_arr = np.loadtxt('/Users/Desktop/python/课时7/课件/python-7.ibm.txt',\

delimiter='\t',usecols=(1),dtype =str, unpack=True,skiprows=1)

t = np.arange(len(c))

计算时间加权平均价TWAP(收盘价)

TWAP = np.average(c,weights=t)
print(TWAP)

找出股票收盘价的极差

max_sub = np.max(c) - np.min(c)

max_sub = np.max(c)- np.ptp(c)
print(max_sub)

计算其收盘价的中位数,均值及方差

print(np.median(c))#收盘价中位数
print(np.mean(c))#均值
print(np.var(c))#方差
print(c[:-1])

计算股票的收益率(简单收益率与对数收益率)

returns = np.diff(c)/c[1:]#网上查的是这一天减前一天的差值除以前一天的值(不知道对不对)
print(returns)
logreturns = np.diff(np.log(c))#对数收益率
print(logreturns[logreturns*100>1].size)#对数收益率大一1%的天数


日期处理
导入文本文件中的股份数据,并将日期转为化对应周几后,再分别去计算从周一到周五的平均价,并找出周几平均 价最高,周几的平均价去低?
数据:ibm 股票数据
提示:自定义日期处理函数,在 loadtxt 的参数中对应处理函数与列。
import datetime

编写转换函数

def datetostr(s):
    truetime = datetime.datetime.strptime(s,'%Y/%m/%d').weekday()+1
    return truetime
date= np.loadtxt('/Users/Desktop/python/课时7/课件/python-7.ibm.txt',\
              delimiter='\t',usecols=(1,),dtype =str, unpack=True,skiprows=1)
close= np.loadtxt('/Users/Desktop/python/课时7/课件/python-7.ibm.txt',\
              delimiter='\t',usecols=(4,),unpack=True,skiprows=1)
 print(datetostr('2017/12/18'))#验证日期对应的星期是否正确
week_arr = list(map(datetostr,date)) #将日期变成星期

指定星期几生成bool型数组,并根据bool值从close中取对应的值生成新的数组

def getweek_bool(which_weekday):
    day_bool = list(map(lambda x:x==which_weekday,week_arr))
    day_close = close[day_bool]
    return day_close
week1_mean = np.mean(getweek_bool(1))#获取星期一收盘价的数据,求均值
print(week1_mean)
week2_mean = np.mean(getweek_bool(2))#获取星期二收盘价的数据,求均值
print(week2_mean)
week3_mean = np.mean(getweek_bool(3))#获取星期三收盘价的数据,求均值
print(week3_mean)
week4_mean = np.mean(getweek_bool(4))#获取星期四收盘价的数据,求均值
print(week4_mean)
week5_mean = np.mean(getweek_bool(5))#获取星期五收盘价的数据,求均值
print(week5_mean)
new_week = [week1_mean,week2_mean,week3_mean,\
            week4_mean,week5_mean]
max_weekday = new_week.index(max(new_week)) + 1 #平均数最大的一天
min_weekday = new_week.index(min(new_week)) + 1#平均数最小的一天
print('周',which_weekday,'的平均值最大')
print('周',min_weekday,'的平均值最大')
已邀请:

qq用户321660

赞同来自:


前几题python前几题python&numpy基础题,没有问题。

softmax那题,
1.找出最大值 ,2,安全处理,3,处理后每个数字除以该行的总和
也没有问题。
但如果我传入的是多行多列的ndarray呢?
可以把softmax这个function再升级下。

股票收益计算那题:
时间加权,你的处理的权重 是依次变大的。也是一种方法。也有别的处理思路,按指数级递增,也可以试试。
处理极差ptp这个函数可以迅速搞定

diff函数用得没有问题,

最后一题按周进行收益率计算,numpy里有函数,可以用更好的方式解决。

要回复问题请先登录注册

返回顶部