python矩阵计算器心得_python数据分析实战---Numpy科学计算工具

Numpy基本认识

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

一个强大的N维数组对象 ndarray

广播功能函数

整合 C/C++/Fortran 代码的工具

线性代数、傅里叶变换、随机数生成等功能

Numpy基础数据结构

NumPy 数组的维数称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推。

在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。

很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。

NumPy 的数组中比较重要 ndarray 对象属性有:

属性说明

ndarray.ndim

秩,即轴的数量或维度的数量

ndarray.shape

数组的维度,对于矩阵,n 行 m 列

ndarray.size

数组元素的总个数,相当于 .shape 中 n*m 的值

ndarray.dtype

ndarray 对象的元素类型

ndarray.itemsize

ndarray 对象中每个元素的大小,以字节为单位

ndarray.flags

ndarray 对象的内存信息

ndarray.real

ndarray元素的实部

ndarray.imag

ndarray 元素的虚部

ndarray.data

包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

import numpy

ar = numpy.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])

print(ar)

print(ar.ndim)

print(ar.shape)

print(ar.size)

print(ar.itemsize)

print(ar.data)

print(ar.dtype)

print(ar.flags)

print(ar.real)

print(ar.imag)

结果:

[[1 2 3 4 5]

[2 3 4 5 6]

[3 4 5 6 7]]

2

(3, 5)

15

4

int32

C_CONTIGUOUS : True

F_CONTIGUOUS : False

OWNDATA : True

WRITEABLE : True

ALIGNED : True

WRITEBACKIFCOPY : False

UPDATEIFCOPY : False

[[1 2 3 4 5]

[2 3 4 5 6]

[3 4 5 6 7]]

[[0 0 0 0 0]

[0 0 0 0 0]

[0 0 0 0 0]]

创建数组

array()函数  括号内可以是list,元组、数组、生成器等

ar = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])

ar1 = np.array(range(10))

ar2 = np.array(10)

ar3 = np.array([[1,2,3,4,5],[2,3,4,5,6],['a','b','c','d']])

print(ar)

print(ar1)

print(ar2)

print(ar3)

输出结果:

[[1 2 3 4 5]

[2 3 4 5 6]

[3 4 5 6 7]]

[0 1 2 3 4 5 6 7 8 9]

10

[list([1, 2, 3, 4, 5]) list([2, 3, 4, 5, 6]) list(['a', 'b', 'c', 'd'])]

arange()函数  类似于range(),在给定间隔内返回均匀间隔的值

print(np.arange(10))

print(np.arange(10.0))

print(np.arange(5,12))

print(np.arange(5.0,12.3))

输出结果:

[0 1 2 3 4 5 6 7 8 9]

[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]

[ 5 6 7 8 9 10 11]

[ 5. 6. 7. 8. 9. 10. 11. 12.]

print(numpy.linspace(5,14,num=10)) #返回在间隔【开始,停止】上计算的num个均匀间隔的样本

print(numpy.linspace(5,14,num=11))

print(numpy.zeros((4,4),dtype=numpy.int)) #创建指定大小的数组,数组元素以 0 来填充

ar = numpy.array([range(10),range(10,20)])

print(numpy.zeros_like(ar))

print(ar)

print(numpy.ones((2,3),dtype=numpy.int)) #创建指定大小的数组,数组元素以 1 来填充

#ones_like()和zeros_like()相似

print(numpy.eye(3,dtype=numpy.int)) #创建一个正方的N+N的单位矩阵,对角线值位1,其余的值为0

输出结果:

[ 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.]

[ 5. 5.9 6.8 7.7 8.6 9.5 10.4 11.3 12.2 13.1 14. ]

[[0 0 0 0]

[0 0 0 0]

[0 0 0 0]

[0 0 0 0]]

[[0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0 0 0]]

[[ 0 1 2 3 4 5 6 7 8 9]

[10 11 12 13 14 15 16 17 18 19]]

[[1 1 1]

[1 1 1]]

[[1 0 0]

[0 1 0]

[0 0 1]]

Numpy通用函数

翻转数组   numpy.T

修改数组形状  numpy.reshape

返回指定形态新数组  numpy.resize

import numpy as np

ar = np.arange(10)

ar1 = np.zeros((2,4))

print(ar)

print(ar1)

print(ar.T)

print(ar1.T)

ar2 = np.arange(12)

ar3 = np.arange(12).reshape(3,4)

print(ar2)

print(ar3)

print(np.resize(ar3,(4,4)))

输出结果:

[0 1 2 3 4 5 6 7 8 9]

[[0. 0. 0. 0.]

[0. 0. 0. 0.]]

[0 1 2 3 4 5 6 7 8 9]

[[0. 0.]

[0. 0.]

[0. 0.]

[0. 0.]]

[ 0 1 2 3 4 5 6 7 8 9 10 11]

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]

[ 0 1 2 3]]

数组的复制 copy()

ar = np.arange(10)

print(ar)

ar1 = ar

ar1[2]=100

print(ar,ar1)

ar3 = ar.copy()

ar3[3]=998

print(ar,ar3)

输出结果:

[0 1 2 3 4 5 6 7 8 9]

[ 0 1 100 3 4 5 6 7 8 9] [ 0 1 100 3 4 5 6 7 8 9]

[ 0 1 100 3 4 5 6 7 8 9] [ 0 1 100 998 4 5 6 7 8 9]

数组的字符转换

ar2 = numpy.array(range(16)).reshape(4,4)

ar3 = ar2.astype(numpy.str)

print(ar3)

输出结果:

[['0' '1' '2' '3']

['4' '5' '6' '7']

['8' '9' '10' '11']

['12' '13' '14' '15']]

连接数组

ar = np.array([[1,2,3],[4,5,6]])

ar1 = np.array([[7,8,9],[10,11,12]])

ar2 = np.stack((ar,ar1),0) #沿新轴连接数组序列

ar3 = np.hstack((ar,ar1))# 横向连接

ar4 = np.vstack((ar,ar1))#纵向连接

print(ar2,ar3,ar4)

输出结果:

[[[ 1 2 3]

[ 4 5 6]]

[[ 7 8 9]

[10 11 12]]]

[[ 1 2 3 7 8 9]

[ 4 5 6 10 11 12]]

[[ 1 2 3]

[ 4 5 6]

[ 7 8 9]

[10 11 12]]

分割数组

ar = np.arange(16).reshape(4,4)

ar1 = np.vsplit(ar,2) #纵向拆分

ar2 = np.hsplit(ar,2) #横向拆分

print(ar)

print(ar1)

print(ar2)

输出结果:

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]

[12 13 14 15]]

[array([[0, 1, 2, 3],

[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],

[12, 13, 14, 15]])]

[array([[ 0, 1],

[ 4, 5],

[ 8, 9],

[12, 13]]), array([[ 2, 3],

[ 6, 7],

[10, 11],

[14, 15]])]

数组的计算

ar2 = numpy.array(range(16)).reshape(4,4)

ar3 = ar2.astype(numpy.str)

print(ar3)

ar4 = ar2*10+100

print(ar4)

print(ar4.mean()) #求平均值

print(ar4.sum()) #求总值

输出结果:

[['0' '1' '2' '3']

['4' '5' '6' '7']

['8' '9' '10' '11']

['12' '13' '14' '15']]

[[100 110 120 130]

[140 150 160 170]

[180 190 200 210]

[220 230 240 250]]

175.0

2800

Numpy索引和切片

基本索引及切片

import numpy as np

#一维数组索引 类似于list

ar = np.arange(20)

# print(ar[2])

# print(ar[3:5])

# print(ar[::2])

#二维数组以及多维数组的逻辑和一维的一样

ar1 = ar.reshape(4,5)

# print(ar1)

print(ar1[2][2])

print(ar1[2:4][0][2])

print(ar1[:2])

输出结果:

12

12

[[0 1 2 3 4]

[5 6 7 8 9]]

布尔型的索引及切片

ar = np.arange(12).reshape(3,4)

print(ar)

i = np.array([True,False,True])

j = np.array([True,False,True,False])

print(i)

print(j)

print(ar[i,:]) #在行中判断,只保留True的值

print(ar[:,j]) #在第二维度中判断,只保留True的值

print(ar[ar>5]) #生成一个新的数组

输出结果:

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

[ True False True]

[ True False True False]

[[ 0 1 2 3]

[ 8 9 10 11]]

[[ 0 2]

[ 4 6]

[ 8 10]]

[ 6 7 8 9 10 11]

Numpy随机数

print(np.random.normal(size=(4,4))) #随机数生成

print(np.random.rand(4)) #生成一个【0-1】之间的随机浮点数或者是N维数组 ---均匀分布

print(np.random.rand(2,4))

print(np.random.randn(4)) #生成一个【0-1】之间的随机浮点数或者是N维数组 ---正态分布

print(np.random.randn(2,4))

print(np.random.randint(5)) #生成一个整数或者N维整数数组

print(np.random.randint(10,50,size=(4,4)))

Nmupy数据输入和输出

ar = numpy.random.randint(0,100,size=(10,10))

numpy.savetxt("savetxt.txt",ar,delimiter=",",fmt="%i") #数据的输出

txt_load = numpy.loadtxt("savetxt.txt",delimiter=',') #数据的输入

print(txt_load)

# print(ar)

相关链接:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值