系统性总结了 Numpy 所有关键知识点

Posted 我爱Python数据挖掘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统性总结了 Numpy 所有关键知识点相关的知识,希望对你有一定的参考价值。

目录

1. 创建数组的几种方式


本文技术工具来自技术群小伙伴的分享,想加入按照如下方式

目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
方式①、添加微信号:dkl88191,备注:来自CSDN+技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群+CSDN

1.0. 引入Numpy库

#引入numpy库
import numpy as np

1.1. 使用np.array创建数组

# 1. 使用np.array创建数组
a = np.array([1,2,3,4])
#打印数组
print(a)
#查看类型
print(type(a))

1.2. 使用np.arange创建数组

#2. 使用np.arange创建数组
#创建0-10步数为2的数组 结果为[0,2,4,6,8]
b = np.arange(0,10,2)

1.3. np.random.random创建数组

#3. np.random.random创建一个N行N列的数组
# 其中里面的值是0-1之间的随机数
# 创建2行2列的数组
c = np.random.random((2,2))

1.4. np.random.randint创建数组

#4. np.random.randint创建一个N行N列的数组
# 其中值的范围可以通过前面2个参数来指定
# 创建值的范围为[0,9)的4行4列数组
d = np.random.randint(0,9,size=(4,4))

1.5. 特殊函数

#5. 特殊函数
#5.1 zeros
## N行N列的全零数组
### 例如:3行3列全零数组
array_zeros = np.zeros((3,3))
#5.2 ones
## N行N列的全一数组
### 例如:4行4列全一数组
array_ones = np.ones((4,4))
#5.3 full
## 全部为指定值的N行N列数组
### 例如:值为0的2行3列数组
array_full = np.full((2,3),9)
#5.4 eye
## 生成一个在斜方形上元素为1,其他元素都为0的N行N列矩阵
### 例如:4行4列矩阵
array_eye = np.eye(4)

1.6. 注意

 数组中的数据类型必须一致,要么全部为整型,要么全部为浮点类型,要么全部为字符串类型
 不能同时出现多种数据类型

2. 数组数据类型


2.1 数据类型

数据类型描述唯一标识符
bool用一个字节存储的布尔类型(True或False)b
int8一个字节大小,-128 至 127i1
int16整数,16 位整数(-32768 ~ 32767)i2
int32整数,32 位整数(-2147483648 ~ 2147483647)i4
int64整数,64 位整数(-9223372036854775808 ~ 9223372036854775807)i8
uint8无符号整数,0 至 255u1
uint16无符号整数,0 至 65535u2
uint32无符号整数,0 至 2 ** 32 - 1u4
uint64无符号整数,0 至 2 ** 64 - 1u8
float16半精度浮点数:16位,正负号1位,指数5位,精度10位f2
float32单精度浮点数:32位,正负号1位,指数8位,精度23位f4
float64单精度浮点数:64位,正负号1位,指数11位,精度52位f8
complex64复数,分别用两个32位浮点数表示实部和虚部c8
complex128复数,分别用两个64位浮点数表示实部和虚部c16
object_python对象O
string_字符串S
unicode_unicode类型U

2.2 创建数组指定数据类型

import numpy as np
a = np.array([1,2,3,4,5],dtype='i1')
a = np.array([1,2,3,4,5],dtype=int32)

2.3 查询数据类型

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
d = np.array([Person('test1',18),Person('test2',20)])
print(d)
print(d.dtype)

2.4 修改数据类型

f = a.astype('f2')

2.5 总结

1) Numpy是基于C语言编写,引用了C语言的数据类型,所以Numpy的数组中数据类型多样
(2) 不同的数据类型有利于处理海量数据,针对不同数据赋予不同数据类型,从而节省内存空间

3. 多维数组


3.1 数组维度查询

import numpy as np
# 数组维度
## 维度为1
a1 = np.array([1,2,3])
print(a1.ndim)
## 维度为2
a2 = np.array([[1,2,3],[4,5,6]])
print(a2.ndim)
## 维度为3
a3 = np.array([
    [
        [1,2,3],
        [4,5,6]
    ],
    [
        [7,8,9],
        [10,11,12]
    ]
])
print(a3.ndim)

3.2 数组形状查询

a1 = np.array([1,2,3])
# 结果为(3,)
print(a1.shape)
a2 = np.array([[1,2,3],[4,5,6]])
# 结果为(2,3)
print(a2.shape)
a3 = np.array([
    [
        [1,2,3],
        [4,5,6]
    ],
    [
        [7,8,9],
        [10,11,12]
    ]
])
# 结果为(2,2,3)
print(a3.shape)

3.3 修改数组形状

a1 = np.array([
    [
        [1,2,3],
        [4,5,6]
    ],
    [
        [7,8,9],
        [10,11,12]
    ]
])
a2 = a1.reshape((2,6))
print(a2)
#结果为(2, 6)
print(a2.shape)
# 扁平化 (多维数组转化为一维数组)
a3 = a2.flatten()
print(a3)
print(a3.ndim)

3.4 数组元素个数与所占内存

a1 = np.array([
    [
        [1,2,3],
        [4,5,6]
    ],
    [
        [7,8,9],
        [10,11,12]
    ]
])
#数组的元素个数
count = a1.size
print(count)
#各元素所占内存
print(a1.itemsize)
#各元素数据类型
print(a1.dtype)
#数组所占内存
print(a1.itemsize * a1.size)

3.5 总结

1)一般情况下,数组维度最大到三维,一般会把三维以上的数组转化为二维数组来计算
(2)ndarray.ndmin查询数组的维度
(3)ndarray.shape可以看到数组的形状(几行几列),shape是一个元组,里面有几个元素代表是几维数组
(4)ndarray.reshape可以修改数组的形状。条件只有一个,就是修改后的形状的元素个数必须和原来的个数一致。比如原来是(2,6),那么修改完成后可以变成(3,4),但是不能变成(1,4)。reshape不会修改原来数组的形状,只会将修改后的结果返回。
(5)ndarray.size查询数组元素个数
(6)ndarray.itemsize可以看到数组中每个元素所占内存的大小,单位是字节。(1个字节=8位)

4. 数组索引和切片


4.1 一维数组

import numpy as np
# 1. 一维数组的索引和切片
a1 = np.arange(10)
## 结果为:[0 1 2 3 4 5 6 7 8 9]
print(a1)
# 1.1 进行索引操作
## 结果为:4
print(a1[4])
# 1.2 进行切片操作
## 结果为:[4 5]
print(a1[4:6])
# 1.3 使用步长
## 结果为:[0 2 4 6 8]
print(a1[::2])
# 1.4 使用负数作为索引
## 结果为:9
print(a1[-1])

4.2 二维数组

# 2. 多维数组
# 通过中括号来索引和切片,在中括号中使用逗号进行分割
#逗号前面的是行,逗号后面的是列,如果多维数组中只有一个值,那么这个值就是行
a2 = np.random.randint(0,10,size=(4,6))
print(a2)
#获取第0行数据
print(a2[0])
#获取第1,2行数据
print(a2[1:3])
#获取多行数据 例0,2,3行数据
print(a2[[0,2,3]])
#获取第二行第一列数据
print(a2[2,1])
#获取多个数据 例:第一行第四列、第二行第五列数据
print(a2[[1,2],[4,5]])
#获取多个数据 例:第一、二行的第四、五列的数据
print(a2[1:3,4:6])
#获取某一列数据 例:第一列的全部数据
print(a2[:,1])
#获取多列数据 例:第一、三列的全部数据
print(a2[:,[1,3]])

4.3 总结

1. 如果数组是一维的,那么索引和切片就是和python的列表是一样的
2. 如果是多维的(这里以二维为例),那么在中括号中,给两个值,两个值是通过逗号分隔的,逗号前面的是行,逗号后面的是列。如果中括号中只有一个值,那么就是代表行。
3. 如果是多维数组(以二维为例),那么行的部分和列的部分,都是遵循一维数组的方式,可以使用整型、切片,还可以使用中括号的形式代表连续的。比如a[[1,2],[3,4]],那么返回的就是第一行第三列、第二行第四列的两个值。

5. 布尔索引


#生成1-24的4行6列的二维数组
a2 = np.arange(24).reshape((4,6))
#array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a2[a2<10]
#array([ 0,  1,  2,  3,  4, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,23])
a2[(a2<5) | (a2>10)]

5.1总结

1) 布尔索引是通过相同数据上的True还是False来进行提取的。
(2) 提取条件可以为一个或多个,当提取条件为多个时使用&代表且,使用|代表或
(3) 当提取条件为多个时,每个条件要使用圆括号括起来

6. 数组元素值的替换


6.1 方式一:索引

#利用索引可以做值的替换,把满足条件的位置的值替换成其他值
#创建数组元素值为[0,10)随机数的3行5列数组
a3 = np.random.randint(0,10,size=(3,5))
print(a3)
#将a3数组第一行数据全部更换为0
a3[1] = 0
print(a3)
#将a3数组第一行数据更换为[1,2,3,4,5] -- 数据个数要对应
a3[1] = np.array([1,2,3,4,5])
print(a3)

6.2 方式二:条件索引

#数组中值小于3的元素全部替换为1
a3[a3 < 3] = 1
print(a3)

6.3 方式三:函数

#将a3数组中小于5的值替换为0,剩余值替换为1
result = np.where(a3<5,0,1)
result

6.4 总结

1)使用索引或者切片来替换值
(2)使用条件索引来替换值
(3)使用where函数来实现替换值

7. 数组的广播机制

7.0. 数组的广播原则

如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在全是和(或)长度为1的维度上进行。
案例分析:

  1. shape为(3,8,2)的数组能和(8,3)的数组进行运算吗?分析:不能,因为安装广播原则,从后面网前面数,(3,8,2)和(8,3)中的2和3不相等,所以不能进行运算

  2. shape为(3,8,2)的数组能和(8,1)的数组进行运算吗?分析:,因为按照广播原则,从后面往前面数,(3,8,2)和(8,1)中的2和1虽然不相等,但因为有一方的长度为1,所以能参加运算

  3. shape为(3,1,8)的数组能和(8,1)的数组进行运算吗?分析:,因为按照广播原则,从后面往前面数,(3,1,8)和(8,1)中的4和1虽然不相等且1和8不相等,但是因为这两项中有一方的长度为1,所以能参加运算

7.1. 数组与数字运算

import numpy as np
#生成3行5列 值为0-5随机整数的数组
a1 = np.random.randint(0,5,size=(3,5))
#数组中的所有元素都乘2
print(a1*2)
#数组中所有的元素只保留2位小数
print(a1.round(2))

7.2. 数组与数组运算

#数组形状一致时 各个元素相加减(满足数组广播机制)
a2 = np.random.randint(0,5,size=(3,5))
a1+a2
#形状不一致的数组不能相加减(不满足数组广播机制)
a3 = np.random.randint(0,5,size=(3,4))
# a1+a3 报错
#两个数组行数相同 ,其中一个数组列数为1(满足数组广播机制)
a4 = np.random.randint(0,5,size=(3,1))
a1+a4
#两个数组列数相同 ,其中一个数组行数为1(满足数组广播机制)
a5 = np.random.randint(0,5,size=(1,5))
a1+a5

7.3总结

(1) 数组和数字直接进行运算是没有问题的
(2) 两个shape想要的数组是可以进行运算的
(3) 如果两个shape不同的数组,想要进行运算,那么需要看他们是否满足广播原则

8. 数组形状的操作

8.1. 数组形状的改变

8.1.1 reshape与resize

import numpy as np
# reshape与resize都是用来修改数组形状的,但是存在不同
a1 = np.random.randint(0,10,size=(3,4))
# reshape是将数组转换成指定的形状,然后返回转换后的结果,对于原数组的形状是不会发生改变的
a2 = a1.reshape((2,6))
# resize是将数组转换成指定的形状,会直接修改数组本身,并且不会返回任何值
a1.resize((4,3))
print(a1)

8.1.2 flatten与ravel

 # faltten与ravel都是将多维数组转换为一维数组,但是存在不同
 a3 = np.random.randint(0,10,size=(3,4))
 # flatten是将数组转换为一维数组后,然后将这个拷贝返回回去,然后后续对这个返回值进行修改不会影响之前的数组
 a4 = a3.flatten()
 a4[0] = 100
 # 结果为:2
 print(a3[0,0])
 # 结果为:100
 print(a4[0])
 # ravel是将数组转换为一维数组后,将这个视图(引用)返回回去,后续对这个返回值进行修改会影响之前的数组
 a5 = a3.ravel()
 a5[0] = 100
 # 结果为:100
 print(a3[0,0])
  # 结果为:100
 print(a5[0])

8.2 数组的叠加

#vstack代表在垂直方向叠加,如果想要叠加成功,那么列数必须一致
#hstack代表在水平方向叠加,如果想要叠加成功,那么行数必须一致
#concatenate可以手动的指定axis参数具体在哪个方向叠加
##(1)如果axis=0,代表在水平方向叠加
##(2)如果axis=1,代表在垂直方向叠加
##(3)如果axis=None,会先进行叠加,再转化为1维数组
vstack1 = np.random.randint(0,10,size=(3,4))
print(vstack1)
vstack2 = np.random.randint(0,10,size=(2,4))
print(vstack2)

#垂直方向叠加的两种方式
vstack3 = np.vstack([vstack1,vstack2])
print(vstack3)
vstack4 = np.concatenate([vstack1,vstack2],axis=0)
print(vstack4)

h1 = np.random.randint(0,10,size=(3,4))
print(h1)
h2 = np.random.randint(0,10,size=(3,1))
print(h2)

#水平方向叠加的两种方式
h3 = np.hstack(以上是关于系统性总结了 Numpy 所有关键知识点的主要内容,如果未能解决你的问题,请参考以下文章

系统性总结了 Numpy 所有知识点

系统性总结了 Numpy 所有知识点

系统性总结了 Numpy 所有知识点

numpy nan和inf

1.numpy知识点总结

Python - 替换熊猫数据框中的负无穷大值[重复]