NumPy科学计算库(1)Python数据分析

1 NumPy简介

简单来说NumPy的功能就是就是对可以一个数值集合(eg:数组)进行各种各样的操作。
NumPy(Numerical Python)是Python的一种开源的 数值计算扩展。提供多维数组对象,各种派生对
象(如掩码数组和矩阵),这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested
list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)), 支持大量的维度数组与矩阵
运算,此外也针对数组运算提供大量的数学函数库,包括数学、逻辑、形状操作、排序、选择、输入输
出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等

  • 使用需要 安装numpy库(注意:首先要在电脑中安装的有python,安装方式如下:
    (1) *第一种方式:
pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

然后在你想要存放文件的目录打开cmd输入:jupyter notebook
(2) 第二种方式:
直接安装anaconda下载,它自带jupyter notebook(安装anaconda的过程中记得有个 Add Path选项 一定要勾上,以免后面自己添加环境变量很麻烦)

  • 前置知识
    (1)如何启动终端
    Windows—-> 快捷键:win + R —–>输入:cmd回车——>命令行出来
    Mac —->启动终端
    (2)启动jupyter notebook
    进入终端输入指令:jupyter notebook
    在哪里启动jupyter启动,浏览器上的目录,对应哪里,windows默认路径是:
    C:\Users\lufengkun
    C:\Users\xxx
    (3)jupyter notebook更过内容(例如扩展的使用,请阅读:https://blog.csdn.net/qq_34516746/article/details/124147543?spm=1001.2014.3001.5501

2 基本操作

2.1 数组创建

创建数组的最简单的方法就是使用array函数,将Python下的list转换为ndarray。

import numpy as np
l = [1,2,3,5,7,9]
arr = np.array(l)
arr

我们可以利用np中的一些内置函数来创建数组,比如我们创建全0的数组,也可以创建全1数组,全是其
他数字的数组,或者等差数列数组,正态分布数组,随机数。

import numpy as np arr1 = np.ones(10)
arr2 = np.zeros(10)
arr3 = np.full(shape = [2,3],fill_value=2.718)

arr4 = np.arange(start = 0,stop = 20,step = 2)

arr5 = np.linspace(start =0,stop = 9,num = 10)

arr6 = np.random.randint(0,100,size = 10)

arr7 = np.random.randn(5)
arr8 = np.random.random(size = 5)

2.2 查看操作

NumPy的数组类称为ndarray,也被称为别名 array。请注意,numpy.array这与标准Python库类不同
array.array,后者仅处理一维数组且功能较少。ndarray对象的重要属性是

  • 数组的(1)轴数、(2)维数、(3)尺寸形状、(4)元素总数、(5)数组类型、(6)数组中每个元素的大小(以字节为单位)
import numpy as np
arr = np.random.randint(0,100,size=(3,4,5))
arr.ndim
arr.shape
arr.shape
arr.size
arr.dtype
arr.itemsize

2.3 文件IO操作

2.3.1 保存数组

save方法保存ndarray到一个npy文件,也可以使用savez将多个array保存到一个.npz文件中

import numpy as np
x = np.random.randn(5)
y = np.arange(0,10,1)

np.save("x_arr",x)

np.savez("some_array.npz",xarr=x,yarr=y)

NumPy科学计算库(1)Python数据分析

2.3.2 读取

load方法来读取存储的数组,如果是.npz文件的话,读取之后相当于形成了一个key-value类型的变量,通过保存时定义的key来获取相应的array

import numpy as np
np.load("x_arr.npy")
np.load("some_array.npz")["yarr"]

2.3.3 读写csv、txt文件

import numpy as np
arr = np.random.randint(0,10,size=(3,4))

np.savetxt("arr.csv",arr,delimiter=',')

np.loadtxt("arr.csv",delimiter=',',dtype=np.int32)

3 数据类型的设置和转化

  • ndarray的数据类型:
    (1) int: int8、uint8、int16、int32、int64
    (2) float: float16、float32、float64
    (3) *str
import numpy as np

arr = np.array([1,2,5,8,2],dtype='float32')

arr = [1,3,5,7,2,9,0]

arr = np.asarray(arr,dtype='float32')

arr = np.random.randint(0,10,size=5,dtype='int16')

arr = arr.astype(dtype='float32')

4 数组运算

  • 加减乘除运算
import numpy as np
arr1 = np.array([1,2,3,4,5])
arr2 = np.array([2,3,1,5,9])
arr1 - arr2
arr1 * arr2
arr1 / arr2
arr1 // arr2
arr1**arr2
  • 逻辑运算
import numpy as np
arr1 = np.array([1,2,3,4,5])
arr2 = np.array([1,0,2,3,5])
arr1 < 5
arr1 > 5
arr1 == 5
arr1 == arr2
arr1 > arr2
  • 数组和标量(就是一个数)的计算
import numpy as np
arr = np.arange(1,10)
1/arr
arr+5
arr*5
    • =、+=、-=操作
      某些操作(例如+=和
      =)只会修改现有数组,而不是创建一个新数组。
import numpy as np
arr1 = np.arange(5)
arr1 +=5
arr1 -=5
arr1 *=5

5 复制和视图

在操作数组时,有时会将其数据复制到新数组中,有时不复制。对于初学者来说,这通常会引起混乱。有以下三种情况

  • 完全没有复制(两个是一个东西)
import numpy as np
a = np.random.randint(0,100,size=(4,5))
b = a
a is b
b[0,0] = 1024
display(a,b)
  • 查看或者浅拷贝
    不同的数组对象可以共享相同的数据。该view方法创建一个查看相同数据的新数组对象
import numpy as np
a = np.random.randint(0,100,size=(4,5))
b = a.view()
a is b
b.base is a
b.flags.owndata
a.flags.owndata
b[0,0] = 1024
display(a,b)
  • 深拷贝
import numpy as np
a = np.random.randint(0,100,size=(4,5))
b = a.copy()
b is a
b.base is a
b.flags.owndata
a.flags.owndata
b[0,0] = 1024
display(a,b)

注意:copy应该在 不再需要原来的数组情况下,切片后调用。例如:假设a是一个巨大的中间结果,而最
终结果b仅包含的一小部分a,则在b使用切片进行构造时应制作一个深拷贝:

import numpy as np
a = np.arange(1e8)
b = a[::1000000].copy()
del a
b.shape

5 索引、切片和迭代

5.1 基本索引和切片

numpy中数组切片是原始数组的视图,这意味着数据不会被复制,视图上任何数据的修改都会反映到原
数组上。

import numpy as np
arr = np.array([0,1,2,3,4,5,6,7,8,9])
arr[5]
arr[5:8]
arr[2::2]
arr[::3]
arr[1:7:2]
arr[::-1]
arr[::-2]
arr[5:8] = 12

temp = arr[5:8]
temp[1] = 1024
arr

对于二维数组或者高维数组,我们可以按照之前的知识来索引,当然也可以传入一个以逗号隔开的索引
列表来选区单个或多个元素

import numpy as np
arr2d = np.array([[1,3,5],[2,4,6],[-2,-7,-9],[6,6,6]])
arr2d.shape
arr2d

arr2d[0,-1]
arr2d[0,2]

arr2d[:2,-2:]

arr2d[:2,1:]

5.2 花式索引和索引技巧

  • 整数数组进行索引即花式索引,其和切片不一样,它总是将数据复制到新数组中
import numpy as np

arr1 = np.array([1,2,3,4,5,6,7,8,9,10])
arr2 = arr1[[1,3,3,5,7,7,7]]
arr2[-1] = 1024

arr2d = np.array([[1,3,5,7,9],[2,4,6,8,10],[12,18,22,23,37],[123,55,17,88,103]])
arr2d.shape
arr2d[[1,3]]

arr2d[([1,3],[2,4])]

arr2d[np.ix_([1,3,3,3],[2,4,4])]
arr2d[[1,3,3,3]][:,[2,4,4]]

  • *boolean值的索引
import numpy as np
names = np.array(['softpo','Brandon','Will','Michael','Will','Ella','Daniel','softpo','Will','Brandon'])
cond1 = names =='Will'
cond1
names[cond1]
arr = np.random.randint(0,100,size=(10,8))
cond2 = arr > 90

arr[cond2]

6 形状操作

6.1 数组变形

import numpy as np
arr1 = np.random.randint(0,10,size=(3,4,5))

arr2 = arr1.reshape(12,5)
arr3 = arr1.reshape(-1,5)
arr3 = arr1.reshape(-1,6)

6.2 数组转置

import numpy as np
arr1 = np.random.randint(0,10,size=(3,5))
arr1.T
arr2 = np.random.randint(0,10,size=(3,6,4))
np.transpose(arr2,axes=(2,0,1))

6.3 数组堆叠

import numpy as np
arr1 = np.array([[1,2,3]])
arr2 = np.array([[4,5,6]])
np.concatenate([arr1,arr2],axis=0)

np.concatenate([arr1,arr2],axis=1)

np.hstack((arr1,arr2))
np.vstack((arr1,arr2))

6.4 split数组拆分

import numpy as np
arr = np.random.randint(0,10,size=(6,5))
arr1,arr2 = np.split(arr,indices_or_sections=2,axis=0)
display(arr1,arr2)
np.split(arr,indices_or_sections=[2,3],axis=1)

np.vsplit(arr,indices_or_sections=3)
np.hsplit(arr,indices_or_sections=[1,4])

7 广播机制

当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这
种机制叫做广播(broadcasting)。

  • 一维数组的广播
import numpy as np
arr1 = np.sort(np.array([0,1,2,3]*3)).reshape(4,3)
arr2 = np.array([1,2,3])
arr3 = arr1 + arr2
arr3
  • 二维数组的广播
    NumPy科学计算库(1)Python数据分析
import numpy as np
arr1 = np.sort(np.array([0,1,2,3]*3)).reshape(4,3)
arr2 = np.array([[1],[2],[3],[4]])
arr3 = arr1 + arr2
arr3
  • 三维数组广播
    NumPy科学计算库(1)Python数据分析
import numpy as np
arr1 = np.array([0,1,2,3,4,5,6,7]*3).reshape(3,4,2)
arr2 = np.array([0,1,2,3,4,5,6,7]).reshape(4,2)
arr3 = arr1 + arr2
arr3

8 通用函数

8.1 元素级数字函数

abs、sqrt、square、exp、log、sin、cos、tan,maxinmum、minimum、all、any、inner、clip、round、trace、ceil、floor

import numpy as np
arr1 = np.array([1,4,8,9,16,25])
np.sqrt(arr1)
np.square(arr1)
np.clip(arr1,2,16)

x = np.array([1,5,2,9,3,6,8])
y = np.array([2,4,3,7,1,9,0])
np.maximum(x,y)
arr2 = np.random.randint(0,10,size = (5,5))
np.inner(arr2[0],arr2)

8.2 where函数

where 函数,三个参数,条件为真时选择值的数组,条件为假时选择值的数组

import numpy as np
arr1 = np.array([1,3,5,7,9])
arr2 = np.array([2,4,6,8,10])
cond = np.array([True,False,True,True,False])
np.where(cond,arr1,arr2)

arr3 = np.random.randint(0,30,size = 20)
np.where(arr3 < 15,arr3,-15)

8.3 排序方法

np中还提供了排序方法,排序方法是就地排序,即直接改变原数组
arr.sort()、np.sort()、arr.argsort()

import numpy as np
arr = np.array([9,3,11,6,17,5,4,15,1])
arr.sort()
np.sort(arr)
arr = np.array([9,3,11,6,17,5,4,15,1])
arr.argsort()

8.4 集合运算函数

import numpy as np
A = np.array([2,4,6,8])
B = np.array([3,4,5,6])
np.intersect1d(A,B)
np.union1d(A,B)
np.setdiff1d(A,B)

8.5 数学和统计函数

min、max、mean、median、sum、std、var、cumsum、cumprod、argmin、argmax、argwhere、cov、corrcoef

import numpy as np
arr1 = np.array([1,7,2,19,23,0,88,11,6,11])
arr1.min()
arr1.argmax()
np.argwhere(arr1 > 20)
np.cumsum(arr1)
arr2 = np.random.randint(0,10,size = (4,5))

arr2.mean(axis = 0)
arr2.mean(axis = 1)
np.cov(arr2,rowvar=True)
np.corrcoef(arr2,rowvar=True)

9 线性代数

9.1 矩阵乘积

import numpy as np
A = np.array([[4,2,3], [1,3,1]])
B = np.array([[2,7], [-5,-7], [9,3]])
np.dot(A,B)
A @ B

9.2 矩阵的其他计算

from numpy.linalg import inv,det,eig,qr,svd
A = np.array([[1,0,0],
              [0,2,0],
              [0,0,3]])
inv(A)
det(A)

10 练习实例

1、创建一个长度为10的一维全为0的ndarray对象,然后让第5个元素等于1

import numpy as np
arr = np.zeros(10,dtype = 'int')

arr[4] = 1
arr

2、创建一个元素为从10到49(包含49)的ndarray对象,间隔是1

import numpy as np

arr = np.arange(10,50)
arr

3、将第2题的所有元素位置反转

import numpy as np

arr = np.arange(10,50)

arr = arr[::-1]
arr

4、使用np.random.random创建一个10*10的ndarray对象,并打印出最大最小元素

import numpy as np

arr = np.random.random(size = (10,10))

print('输出最大值:',arr.max())
print('输出最小值:',arr.min())

5、创建一个10*10的ndarray对象,且矩阵边界全为1,里面全为0

import numpy as np
arr = np.full(shape = (10,10),fill_value=0,dtype=np.int)

arr[[0,-1]] = 1

arr[:,[0,-1]] = 1
arr

6、创建一个每一行都是从0到4的5*5矩阵

import numpy as np

arr = np.zeros((5,5))

arr += np.arange(5)

print(arr)

7、创建一个范围在(0,1)之间的长度为12的等差数列,创建[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]等比数列。

import numpy as np

arr = np.linspace(0,1,12)
display(arr)

arr2 = np.logspace(0,10,base=2,num = 11,dtype='int')
arr2

8、创建一个长度为10的正太分布数组np.random.randn并排序

import numpy as np

arr = np.random.randn(10)
print('未排序:',arr)

arr2 = np.sort(arr)
print('排序后:',arr2)

9、创建一个长度为10的随机数组并将最大值替换为-100

import numpy as np

np.set_printoptions(suppress = True)
arr = np.random.random(10)
print('原数据:\n',arr)

v = arr.max()

cond = arr == v

arr[cond] = -100
print('修改之后数据:\n',arr)

10、如何根据第3列大小顺序来对一个5*5矩阵排序?(考察argsort()方法)

np.random.seed(10)
arr = np.random.randint(0,10,(5,5))
print('原始数据:\n',arr)

print('第三列数据:', arr[:,2])

print('第三列数据的排序:',np.argsort(arr[:,2]))

print('根据第三列大小排序:\n',arr[np.argsort(arr[:,2])])

Original: https://blog.csdn.net/qq_34516746/article/details/124266686
Author: jaydenStyle
Title: NumPy科学计算库(1)Python数据分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/759253/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球