Python Numpy库用法笔记

  • 一、简单了解Numpy
  • 1.1通过ndarray存储数据
  • 1.2 ndarray在计算中的优势
  • 二、ndarray的属性
  • 三、基本操作
  • 3.1 生成数组的方法
  • 3.1.1生成0和1
  • 3.1.2 从现有数组中生成
  • 3.1.3生成固定单位的数组
  • 3.1.4 生成随机数组
  • 3.2 数组的索引、切片
  • 3.2.1 一维数组的切片、索引
  • 3.2.2 二维数组的切片、索引
  • 3.2.3 三维数组的切片、索引
  • 3.3 形状的修改
  • 3.4类型的修改
  • 3.5数组的去重
  • 四、ndarray运算
  • 4.1 逻辑运算
  • 4.1.1布尔索引
  • 4.1.2通用判断
  • 4.1.3 三元运算符
  • 4.2 统计运算
  • 4.2.1 统计指标
  • 4.2.2 返回最大值、最小值的位置
  • 4.3 数组间运算
  • 4.3.1 数组与数的运算
  • 4.3.1 数组与数组的运算
  • 4.4 矩阵运算
  • 4.4.1 矩阵存储方法
  • 4.4.2 矩阵的乘法
  • 五、ndarray的合并、分割
  • 5.1ndarray的合并
  • 5.2 ndarray的分割
  • 六、IO操作与数据处理


用于日常学习的积累,如有不足请多多指教。

一、简单了解Numpy

Numpy可以看成是2个缩写单词拼接而成:
·num(numerical) 数值化的
·py(python)
Numpy→数值计算库

  1. Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。
  2. Numpy使用ndarray对象来处理多维数组,该对象是一个快速而且灵活的大数据容器。

ndarray可以看成是3个缩写单词拼接而成:
·n任意个
·d(dimension)维度
·array数组

1.1通过ndarray存储数据

import numpy as np

np.array([[80,58,75,78],
        [98,70,85,84],
        [90,75,90,90],
        [88,70,82,80]])

python3 使用numpy python numpy用法_开发语言

1.2 ndarray在计算中的优势

Numpy在计算中的优势
1.存储内容
1)ndarray存储数据类型相同且存储地址连续,但通用性不强
2)list存储数据类型可以不相同,存储地址不一定连续,但通用性强
2.ndarray支持并行化运算
3.Numpy底层使用C语言编写,数组操作不受Python解释器的影响,效率高于纯Python代码

  • 代码示例:
import numpy as np
import time
import random

mylist=[i for i in range(100000000)]
myndarray=np.array(list)

start_time1=time.time()
sum(mylist)
end_time1=time.time()

start_time2=time.time()
np.sum(myndarray)
end_time2=time.time()

print(f"list运算时间:{end_time1-start_time1}")
print(f"ndarray运算时间:{end_time2-start_time2}")

结果:

python3 使用numpy python numpy用法_python3 使用numpy_02

二、ndarray的属性

属性名字

属性解释

ndarray.shape

数组位的的元组

ndarray.dtype

数组元素的类型

ndarray.ndim

数组维度

ndarray.size

数组中的元素数量

ndarray.itemsize

一个数组元素的长度

  • 代码示例:
import numpy as np

output_value=np.array([[80,58,75,78],
                        [98,70,85,84],
                        [90,75,90,90],
                        [88,70,82,80]])
output_value.shape
output_value.dtype
output_value.ndim
output_value.size
output_value.itemsize

python3 使用numpy python numpy用法_数组_03

三、基本操作

3.1 生成数组的方法

3.1.1生成0和1

np.zeros(shape) #生成一组全是零的数组
npones(shape) #生成一组全是一的数组
  • 代码示例:
np.zeros(shape=(4,4))

python3 使用numpy python numpy用法_python_04

3.1.2 从现有数组中生成

np.array() #深拷贝
np.copy() #深拷贝
np.asarray() #浅拷贝

深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。
浅拷贝只是一种简单的拷贝 拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间。

  • 代码示例:
myarray=np.zeros(shape=(2,2))
array1=np.array(myarray)
array2=np.copy(myarray)
array3=np.asarray(myarray)

print(f"array1:\n{array1}\narray2:\n{array2}\narray3:\n{array3}\n")

myarray[0][0]=1

print(f"array1:\n{array1}\narray2:\n{array2}\narray3:\n{array3}\n")

结果:

python3 使用numpy python numpy用法_后端_05

3.1.3生成固定单位的数组

np.linspace(start,stop,num,...)
#start、stop→左闭右闭:[start, stop]
#num:生成等距离数据的个数

np.arange(start,stop,step,...)
#start、stop→左闭右闭:[start, stop)
#step是步长
#(与range(start,stop,step)类似)
  • 代码示例:
np.linspace(0, 10, 5)

np.arange(0, 10, 2)

结果:

python3 使用numpy python numpy用法_开发语言_06


python3 使用numpy python numpy用法_开发语言_07

3.1.4 生成随机数组

np.random.uniform(low=-1,high=1,size=100) #均匀分布生成随机数
np.random.normal(loc=0.0,scale=1.0,size=None) #正态分布生成随机数
#loc:此概率分布的均值
#scale:此概率分布的标准差
#size:输出的shape
  • 代码示例:
np.random.uniform(low=-1,high=1,size=100)

np.random.normal(loc=0.0,scale=1.0,size=100)

结果:

python3 使用numpy python numpy用法_开发语言_08


python3 使用numpy python numpy用法_python3 使用numpy_09

3.2 数组的索引、切片

3.2.1 一维数组的切片、索引

data=np.random.uniform(low=-1,high=1,size=10)
print(data)

#索引:第5个数据
print(data[4])

#切片:第3到5个数据
print(data[2:5])

结果:

python3 使用numpy python numpy用法_python3 使用numpy_10

3.2.2 二维数组的切片、索引

data2=np.array([[80,58,75,78],
                [98,70,85,84],
                [90,75,90,90],
                [88,70,82,80]])
                
#索引:第2行第3个数据
print(data2[1,2])

#切片:第2行第2-3个数据
print(data2[1,1:3])

结果:

python3 使用numpy python numpy用法_开发语言_11

3.2.3 三维数组的切片、索引

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

#索引
print(data3[1,0,1])

#切片
print(data3[0,1,0:2])

python3 使用numpy python numpy用法_后端_12

3.3 形状的修改

ndarray.reshape(shape) 返回新的ndarray,原始数据没有改变
ndarray.resize(shape) 没有返回值,对原始的ndarray进行了修改
ndarray.T 转置 行变成列,列变成行
data4=np.array([[1,2,3,4],
                [5,6,7,8],
                [9,10,11,12]])
                
print(data4.reshape(4,3)) #返回一个新的ndarray
print(data4)

data4.resize(4,3) #没有返回值
print(data4)

data4=np.array([[1,2,3,4],
                [5,6,7,8],
                [9,10,11,12]])

print(data4.T) #返回一个新的ndarray
print(data4)

结果:

python3 使用numpy python numpy用法_python_13

3.4类型的修改

ndarray.astype(np.int64)
  • 代码示例:
data4=np.array([[1,2,3,4],
                [5,6,7,8],
                [9,10,11,12]])

print(data4.dtype)

print(data4.astype(np.float64))

结果:

python3 使用numpy python numpy用法_后端_14

3.5数组的去重

np.unique(ndarray)
  • 代码示例:
data5=np.array([[1,2,3,4],
                [3,4,5,6],
                [5,6,7,8]])

print(np.unique(data5)) #返回一个新的ndarray
#或者使用
#print(set(temp.flatten()))

结果:

python3 使用numpy python numpy用法_python3 使用numpy_15

四、ndarray运算

4.1 逻辑运算

4.1.1布尔索引

  • 代码示例:
data5=np.array([[1,2,3,4],
                [3,4,5,6],
                [5,6,7,8]])
                
print(data5 > 5) #将data5中全部元素与5比较大小,并返回布尔值

data5[data5 > 5]=0	#提取data5中大于5的值
print(data5)

结果:

python3 使用numpy python numpy用法_后端_16

4.1.2通用判断

np.all(bool)
#全是True返回True
np.any(bool)
#有一个True返回True
  • 代码示例:
data5[data5 > 5]=0

np.all(data5) #False

np.any(data5) #True

python3 使用numpy python numpy用法_开发语言_17

4.1.3 三元运算符

np.where(bool,改变True位置的值,改变False的位置的值)

np.logical_and()
np.logical_or()
  • 代码示例:
np.where(data5,1,0)	#np.where(data5!=0,1,0)

结果:

python3 使用numpy python numpy用法_python3 使用numpy_18

np.where(np.logical_and(data5>2,data5<5),1,0)

np.where(np.logical_or(data5>2,data5<5),1,0)

结果:

python3 使用numpy python numpy用法_python_19

4.2 统计运算

4.2.1 统计指标

np.min(ndarray,axis,...)
np.max(ndarray,axis,...)
np.median(ndarray,axis,...)
np.mean(ndarray,axis,...)
np.std(ndarray,axis,...)
np.var(ndarray,axis,...)
#axis=1:按行计算
#axis=0:按列计算
  • 代码示例:
np.max(data5,axis=1)

结果:

python3 使用numpy python numpy用法_开发语言_20

4.2.2 返回最大值、最小值的位置

np.argmax(temp, axis)
np.argmin(temp, axis)
  • 代码示例:
np.argmax(data5,axis=1)

结果:

python3 使用numpy python numpy用法_python3 使用numpy_21

4.3 数组间运算

4.3.1 数组与数的运算

将数组内所有的数字分别与另外的数进行四则运算。

  • 代码示例:
data5+1

data5*5

python3 使用numpy python numpy用法_数组_22

4.3.1 数组与数组的运算

当操作两个数组时,numpy会比较他们的形状(shape),当满足下列情况时才能进行运算:

  • 维度相同
  • shape中又一个位置为1

比如
①[[1,0],[0,4]]
shape(2,2)=> shape(1,2,2)
②[[[1,0],[0,4]],[[1,0],[0,4]]]
shape(2,2,2)

①+②=[[[2, 0], [0, 8]], [[2, 0], [0, 8]]]

  • 代码示例:
arr1=np.array([[1,2],[3,4]])
arr2=np.array([[1,0],[0,4]])
arr3=np.array([[1,1],[0,0],[2,2]])
arr4=np.array([[[1,0],[0,4]],[[1,0],[0,4]]])

arr2+arr4

arr1*arr2

arr2*arr3 #抛出异常,shape不同

结果:

python3 使用numpy python numpy用法_开发语言_23

4.4 矩阵运算

矩阵必须是二维的

4.4.1 矩阵存储方法

  1. ndarray的二维数组
  2. matrix
np.mat()

4.4.2 矩阵的乘法

矩阵乘法规则:
第一个矩阵列数=第二个矩阵行数
(m行,n列)*(n行,s列)=(m行,s列)

np.matmul(mat,mat)
np.dot()
  • 代码示例:
np.matmul(arr1,arr2) #用ndarray存储时的运算

mat1=np.mat(arr1)
mat2=np.mat(arr2)

mat1*mat2

结果:

python3 使用numpy python numpy用法_python_24

五、ndarray的合并、分割

5.1ndarray的合并

np.hstack(ndarray,ndarray)	#水平拼接
np.vstack(ndarray,ndarray) #竖直拼接
np.concatenate((ndarray,ndarray,...),axis)
  • 代码示例:
a=np.array([1,2])
b=np.array([3,4])
c=np.array([[5],[6]])

np.hstack((a,b))
np.concatenate((a,b),axis=0)
#array([1, 2, 3, 4])

np.vstack((a,b))
#array([[1, 2],
       [3, 4]])
np.concatenate(((np.vstack((a,b))),c),axis=1)
#array([[1, 2, 5],
       [3, 4, 6]])

结果:

python3 使用numpy python numpy用法_数组_25

5.2 ndarray的分割

np.split(ndarray,sections,axis)
  • 代码示例:
a=np.arange(0,10)
#[0 1 2 3 4 5 6 7 8 9]

np.split(a,5)
#[array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]

np.split(a,[1,5,9])
#[array([0]), array([1, 2, 3, 4]), array([5, 6, 7, 8]), array([9])]

结果:

python3 使用numpy python numpy用法_python_26

六、IO操作与数据处理

np.genfromtxt(path,delimiter)
#delimiter为分隔符

==注意:==无法读取字符串,会变成缺失值
解决方法
1)删除缺失值
2)替换缺失值

  • 代码示例:
np.genfromtxt(r"C:\Users\pc\Desktop\a.txt",delimiter=',')

结果:

python3 使用numpy python numpy用法_python3 使用numpy_27