python之numpy(安装及其使用)

1,447 阅读4分钟

python之numpy(安装及其使用)

博主使用的是python3.8,编译器Pycharm。numpy是python的第三方类库,他提供的数据结构比python的更高效,更高级

以python自带的数组list为例:数组总所周知在内存放的存放是连续,python在数组中开辟的连续空间存储的是相应对象的地址。对相应的数组元素进行访问时,地址的存放是连续的。先获取到地址,再通过地址访问到其具体的内存地址,你可能会觉得貌似大部分语言的设计都是这样,但python的第三方类库numpy在此进行了改善,列表 list 的元素在系统内存中是分散存储的 ,而numpy 数组存储在一个均匀连续的内存块中。这样数组计算遍历所有的元素,不像列表 list 还需要对内存地址进行查找,从而节省了计算资源 。

安装numpy

在代码中直接import numpy,如果编译器爆红则证明未存在numpy,需要先下载(默认是没有的)

在命令行中直接输入 命令

pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install numpy 是使用pip下载numpy ,而后面的参数是指定镜像(国外太慢通常会失败,以后pip下载东西,应该都可以指定这个镜像试一试),

安装好之后你可以在python安装目录下的Lib/site-packages 中看到,默认site-packages会存储你下载的模块

随后你可以直接用代码测试是否成功,你可以按照下图所示输入,出现array(.....)证明已经安装成功。

>>> from numpy import *
>>> eye(4)
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])

修改Pycharm中解释器的位置

如果此时在Pycharm中导入numpy还出现红色感叹号 证明你编译器的中所用的解释器,并不是你下载的那个需要修改。点击file->settings,

随后按照下图操作

如果第二步的下拉框中没有你的位置则点击showAll

点击+号,找到你的python.exe的位置即可

不妨你可以用代码测试一下

import numpy as np
a = np.array([1,2,3])
print('test ',a.shape)

numpy的基本操作

基本数据类型

  • i - integer
  • b - boolean
  • u - unsigned integer
  • f - float
  • c - complex float
  • m - timedelta
  • M - datetime
  • O - object
  • S - string
  • U - unicode string
  • V - fixed chunk of memory for other type ( void )
import numpy as np
arr = np.array(['男', 'banana', 'cherry'])

print(arr.dtype)
# 输出<U6

arr = np.array([1, 2, 3, 4], dtype='S')

print(arr)
print(arr.dtype)
# 输出|S1

数组

​ 使用array进行初始化数组,shape 显示其为数组形状,dtype 为数组对象的类型

import numpy as np
b = np.array([1, 2, 3])
a = np.array([[1, 2, 3], [4, 5, 6]])
c = np.array([[[1, 2], [3, 4], [6]], [[1, 2], [3, 4], [6, 7]]])
c[1][2][0] = 11
# shape 显示其为数组形状,dtype 为数组对象的类型
print('a.shape : ', a.shape)
print('b.shape: ', b.shape)
print('c.shape: ', c.shape)
print('a.dtype: ', a.dtype)
print('c.dtype: ', c.dtype)
print(c)

结构数组

​ 相当于定义c中的结构体,java中的对象。formats中的i表示int,U32...表示。 比如想知道每个人的成绩,就可以用stduents[:][score] 。mean函数计算平均分

结构数组的定义与创建

import numpy as np
# 结构体数组
studentType = np.dtype({'names': ['age', 'sex', 'name', 'score'], 'formats': ['i', 'U32', 'U32', 'f']})
students = np.array([(20, '男', 'whg', 100), (21, 'woman', 'ming', 0)], dtype=studentType)
print('第一个学生 ', students[0])
print('性别', students[0]['sex'])
scores = students[:]['score']
# mean函数计算平均分
print('平均分:', np.mean(scores))
print('students.dtype: ', students.dtype)

连续数组的创建

import numpy as np

print(np.arange(1, 11, 2))
print(np.linspace(1, 9, 5))

​ np.arange 和 np.linspace 起到的作用是一样的,都是创建等差数组。这两个数组的结果 x1,x2 都是[1 3 5 7 9]。结果相同,但是你能看出来创建的方式是不同的。

​ arange() 类似内置函数 range(),通过指定初始值、终值、步长来创建等差数列的一维数组,默认是不包括终值的。

​ linspace 是 linear space 的缩写,代表线性等分向量的含义。linspace() 通过指定初始值、终值、元素个数来创建等差数列的一维数组,默认是包括终值的。

基本运算

num1 = np.arange(1, 11, 2)
num2 = np.linspace(1, 15, 5)
print('num1: ', num1)

print('num2: ', num2)
# 加
print(np.add(num1, num2))
# 减
print(np.subtract(num1, num2))
# 乘
print(np.multiply(num1, num2))
# 除
print(np.divide(num1, num2))
# 求余数
print(np.mod(num1, num2))

print(np.min(num2))
print(np.max(num2))

​ amin(),中后面的数字,0,1表示的是 axis ,又称为秩。不同维度代表的意义不同,以二维为例可以简单理解为0 表示x相同y不同的最小。1 表示y相同x不同的最小

axix不懂的话可以参考这篇文章: zhuanlan.zhihu.com/p/31275071

# 0 表示x相同y不同的最小
print(np.amin(a, 0))
# 1 表示y相同x不同的最小
print(np.amin(a, 1))
# ptp 求相差的最大值
print(np.ptp(a))
print(np.ptp(a, 0))
print(np.ptp(a, 1))

统计数组的百分位数 percentile()

​ 同样,percentile() 代表着第 p 个百分位数,这里 p 的取值范围是 0-100,如果 p=0,那么就是求最小值,如果 p=50 就是求平均值,如果 p=100 就是求最大值。同样你也可以求得在 axis=0 和 axis=1 两个轴上的 p% 的百分位数。

print(np.percentile(a, 50))
print(np.percentile(a, 50, axis=1))
print(np.percentile(a, 50, axis=0))

print(np.sort(a))
print(np.sort(a, axis=0))