python数值计算------数组的创建与操作

通过numpy模块中的array函数实现数组的创建,构成数组的元素都是同质的,即数组中的每一个值都具有相同的数据类型。

数组的创建
# 导入模块,并重命名为np
import numpy as np
# 单个列表创建一维数组
arr1 = np.array([3,10,8,7,34,11,28,72])
# 嵌套元组创建二维数组
arr2 = np.array(((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),(3.2,3,3.8,3,3),(11.2,13.4,15.6,17.8,19)))
print('一维数组:\n',arr1)
print('二维数组:\n',arr2)

在第二个数组中,输入的元素含有整数型和浮点型两种数据类型,但输出时数组元素全部变为浮点型,接下来学习数组元素的获取:

# 一维数组元素的获取
print(arr1[[2,3,5,7]])

# 二维数组元素的获取
# 第2行第3列元素
print(arr2[1,2])
# 第3行所有元素
print(arr2[2,:])
# 第2列所有元素
print(arr2[:,1])
# 第2至4行,2至5行
print(arr2[1:4,1:5])

以上方法取出来的都是连续的行或列,接下来介绍不连续取的例子:

# 第一行、最后一行和第二列、第四列构成的数组
print(arr2[np.ix_([0,-1],[1,3])])
# 第一行、最后一行和第一列、第三列、第四列构成的数组
print(arr2[np.ix_([0,-1],[1,2,3])])
数组的常用属性

往往从外部读入的数据,我们对数据的属性是一无所知的,在numpy模块中,可以通过跟genfromtxt函数读取外部文本文件的数据,这里的文本文件主要为csv文件和txt文件。

np.genfromtxt(fname,dtype=<class 'float'>,comments='#',delimiter=None,skip_header=0,skip_footer=0,converters=None,missing_values=None,filling_values=None,usecols=None,names=None,)

fname:指定需要读入数据的文件路径
dtype:指定读入数据的数据类型,默认为浮点型,如果原数据集中含有字符型数据,必须指定数据类型为“str”。
comments:指定注释符,默认为#,如果原数据的行首有#,将忽略这些行的读入。
delimiter:指定数据集的列分隔符
skip_header:是否跳过数据集的首行,默认不跳过
skip_footer:是否跳过数据集的脚注,默认不跳过
converters:将指定列的数据转化成其他数值
miss_values:指定确实值的标记,如果原数据集中含有指定的标记,读入后这样的数据就为缺失值。
filling_values:指定缺失值的填充值
usecols:指定需要读入那些列
names:为读入数据的列设置列名称

# 读入数据
stu_score = np.genfromtxt(fname = r'stu_socre.txt',delimiter='\t',skip_header=1)
# 查看数据结构
print(type(stu_score))
# 查看数据维数
print(stu_score.ndim)
# 查看数据行列数
print(stu_score.shape)
# 查看数组元素的数据类型
print(stu_score.dtype)
# 查看数组元素个数
print(stu_score.size)
数组的形状处理
arr3 = np.array([[1,5,7],[3,6,1],[2,4,8],[5,8,9],[1,5,9],[8,5,2]])
# 数组的行列数
print(arr3.shape)
# 使用reshape方法更改数组的形状
print(arr3.reshape(2,9))
# 打印数组arr3的行列数
print(arr3.shape)

# 使用resize方法更改数组的形状
print(arr3.resize(2,9))
# 打印数组arr3的行列数
print(arr3.shape)

虽然reshape和resize都是用来改变数组形状的方法,但是reshape方法只是返回改变形状的预览,但并未真正改变数组arr3的形状;而resize方法则不会返回预览,而会直接改变arr3的形状,接下来学习降维:

arr4 = np.array([[1,10,100],[2,20,200],[3,30,300]])
print('原数组:\n',arr4)
# 默认排序降维
print('数组降维:\n',arr4.ravel())
print(arr4.flatten())
print(arr4.reshape(-1))
# 改变排序模式的降维
print(arr4.ravel(order = 'F'))
print(arr4.flatten(order = 'F'))
print(arr4.reshape(-1, order = 'F'))

接下来学习上述三种方法的差异:

# 更改预览值
arr4.flatten()[0] = 2000
print('flatten方法:\n',arr4)
arr4.ravel()[1] = 1000
print('ravel方法:\n',arr4)
arr4.reshape(-1)[2] = 3000
print('reshape方法:\n',arr4)

结果
在这里插入图片描述
通过flatten方法实现的降维返回的是复制,因为对降维后的元素做修改,并没有影响到原数组arr4的结果,相反ravel方法与reshape方法返回的是视图,通过对视图的改变,会影响到原数组arr4。

arr5 = np.array([1,2,3])
print('vstack纵向合并数组:\n',np.vstack([arr4,arr5]))
print('row_stack纵向合并数组:\n',np.row_stack([arr4,arr5]))
arr6 = np.array([[5],[15],[25]])
print('hstack横向合并数组:\n',np.hstack([arr4,arr6]))
print('column_stack横向合并数组:\n',np.column_stack([arr4,arr6]))

纵向堆叠必须保证每个数组的列数相同,横向堆叠必须保证每个数组的行数相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值