NumPy是python语言的第三方库,支持大量高维度的数组和矩阵计算
,此外,numpy也针对数组提供了大量的数学函数,机器学习涉及大量对数组的变换和运算,numpy就成了必不可少的工具之一。
import numpy as np
np.__version__
我的是 1.21.4
版本
Numpy的主要对象是多维数组ndarray。
arr1 = np.array([1,2,3])
print(arr1)
[1 2 3]
那上面的数组就是一个秩为1的数组(这里我们可以简单理解为维度),因为他只有一个轴,而且长度为3
# 通过列表创建二维数组
arr2 = np.array([ [1,2,3] , [4,5,6] ,[6,7,8] ])
print(arr2)
[[1 2 3]
[4 5 6]
[6 7 8]]
zeros:生成指定行数、列数并且全为0的n维数组
可以只写一个,那就是一维数组
zeros( (行,列))
你行列写成几维他就是几维度,下面几个函数也是,我懒,懒得都写!
zeros1 = np.zeros( (3,4))
print(zeros1)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
ones1 = np.ones( (2,2,2) )
print(ones1)
[[[1. 1.]
[1. 1.]]
[[1. 1.]
[1. 1.]]]
没怎么弄过三维的我就勉强优化一下形式,这下看得懂了是吧?:
[
[
[1. 1.],
[1. 1.]
],
[
[1. 1.],
[1. 1.]
]
]
左闭右闭
linspace(start,end,num)
a= np.linspace(1,10,10)
print(a)
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
三维数组
full1 = np.full( (2,3),1 )
print(full1)
[[1 1 1]
[1 1 1]]
写到这的时候,真的给我整笑了,我是看别人的文章然后在自己总结,我看到这题目给我弄不会了,等差数组?难道是设置范围他自己给我生成?然后我去试了试,就是:
arange1 = np.arange(5)
print(arange1)
[0 1 2 3 4]
首先,聪明的csdn友肯定会想,那怎么创建二维的等差呢?
当然可以!
那么,对应的函数是什么呢?我也不知道。
我又是看得别人文章,先给你们看他的答案:
np.arange(6).reshape(2, 3)
厉害吗?
我当时看懂了之后,我觉得,这哥们不知道是真的不懂reshape,还是把这条代码说的和上面显得更贴切一点。总结来说上面两个的代码,就是这个问题:
arange(n).reshape(a, b) 依次生成n个自然数(值域是0到n-1),并且以a行b列的数组形式显示
ok,不谈了,进入正题:
首先来看reshape函数(不改变数据的条件下,修改形状
)的源码:
reshape(self, shape, order='C')
reshape2 = np.arange(4)
reshape2 = reshape2.reshape(2,2,order='C')
print(reshape2)
[[0 1]
[2 3]]
实例:
reshape1 = np.reshape(np.arange(4), (2,2), order='C')
print(reshape1)
[[0 1]
[2 3]]
好,一般的博主在现在都会跳过,但是,我不会,因为,你们真的懂order取值的概念吗?反正我是不懂,我也才学,so,我去试了试
直接给你们看代码,我把源数据变为了:
reshape1 = np.reshape(np.arange(9), (3,3), order='c')
[[0 1 2]
[3 4 5]
[6 7 8]]
[[0 3 6]
[1 4 7]
[2 5 8]]
[[0 1 2]
[3 4 5]
[6 7 8]]
k不在了!估计是新版的问题,我的版本是1.23.1
,估计更新了,没了就更棒了~
不用我说,你们看了上面几种的对比也知道了对吧。
-----------------------------------------------------------------
看了看其他大佬的文章,我觉得我写文章写得慢,有好处也有坏处,好处是想得周到,自己不会的,想到的都会去求解,但是慢在写文章太拖沓,像在写小说一样,所以,下面的文章,我就改变一下,so,希望你们看得懂
np.random.rand(shape)
np.random.rand(2, 2)
[[0.16403419 0.67808061]
[0.04344741 0.19238262]]
重点是随机
随机类:random
首先,满足随机的有以下函数:
randint: 可以创建n维度,看源码:
made。懒得给你们截图,我直接给你们源码的结论:
randint(low, high=None, size=None, dtype=None):
实例:
random2 = np.random.randint(4,size=(2,2))
random3 = np.random.rand(2,2)
random4 = np.random.random(3)
print(random2)
print("____")
print(random3)
print("____")
print(random4)
[[3 2]
[2 0]]
____
[[0.71634611 0.22716593]
[0.80354273 0.36203558]]
____
[0.75746996 0.56738677 0.40173797]
总结:
sum函数不仅可以计算数组元素累加值,而且还可以每一列or每一行单独求和。
实例:
a = np.array([[1, 2],
[3, 4]])
print(a)
print(np.sum(a))
print(np.sum(a, axis=0)) # axis=0 表示对每一列求和
print(np.sum(a, axis=1)) # axis=0 表示对每一行求和
[[1 2]
[3 4]]
10
[4 6]
[3 7]
总结:
sum函数不仅可以计算数组元素平均值,而且还可以每一列or每一行单独求平均值。
实例
a = np.array([[1, 2],
[3, 4]])
print(np.mean(a)) # 求取平均值
print(np.mean(a,axis=1)) # 对每一行 求取平均值
print(np.mean(a,axis=0)) # 对每一列 求取平均值
2.5
[1.5 3.5]
[2. 3.]
格式:tile(a,shape)
看了下源码,我英文差,就没写百分之100的情况:
简单来说,就是把 a 当作我们的元素,去构造一个 形状为shape的数组
实例
a = np.array([[1, 2],
[3, 4]])
print( np.tile(a,2) )
print("-----")
print( np.tile( a,(2,2) ) )
[[1 2 1 2]
[3 4 3 4]]
-----
[[1 2 1 2]
[3 4 3 4]
[1 2 1 2]
[3 4 3 4]]
源码简单不用看
实例
a = np.array([[1, 2, 3, 4],
[8, 7, 6, 5]])
print(a.argsort(axis=-1))# axis= 1 or -1 将元素按照 行 从小到大排序,返回对应位置元素的下标
print("-------")
print(a.argsort(axis=0))# axis= 0 or -2 将元素按照 列 从小到大排序,返回对应位置元素的下标
这里的取值,1和-2是我自己试出来的,网上很多都只写了-1 和 0
[[0 1 2 3]
[3 2 1 0]]
-------
[[0 0 0 0]
[1 1 1 1]]
这玩意我想都不用想,没看源码,不管几维度,都一样算法
实例
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
print(a + b)
print("-"*6)
print(a - b)
print("-"*6)
print(a * b)
print("-"*6)
print(a / b)
[[ 6 8]
[10 12]]
------
[[-4 -4]
[-4 -4]]
------
[[ 5 12]
[21 32]]
------
[[0.2 0.33333333]
[0.42857143 0.5 ]]
特殊情况:
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = np.array([1, 2, 3])
print(a + b)
[[ 2 4 6]
[ 5 7 9]
[ 8 10 12]]
矩阵部分,这里直接看例子,后面我会补充
实例
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
print(np.dot(a,b))
[[19 22]
[43 50]]
a = np.array([[1, 2],
[3, 4]])
print(a.T)
[[1 3]
[2 4]]
a = np.array([[1, 2],
[3, 4]])
print(np.linalg.inv(a))
[[-2. 1. ]
[ 1.5 -0.5]]
这他喵的还要我教的话,那你就别学数据结构了,这是最基本的索引,下标知识。
0
开这里就简单复习一下切片
这博主写的不错!(书写的不错~)
python之切片
实例
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
# 冒号表示所取的范围,跟列表的索引用法一样,
# 逗号用来区分每个维度,下面的代码表示[取倒数第二行到最后一行, 第二列到第三列
print(a[-2:, 1:3])
实例
a = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
])
a[[0, 1, 2], [1, 1, 1]] += 10
print(a)
result_index = a > 10
[[False True False False]
[False True False False]
[False True True True]]
a1 = np.array([1, 2, 3])
print(a1.dtype)
int32
a = np.array(['1.2', '1.3', '1.4'], dtype = np.string_)
array([b'1.2', b'1.3', b'1.4'], dtype='|S3')
a.astype(np.float)
array([1.2, 1.3, 1.4])
sry,我看了看比赛的赛题要求,资格赛的pands,numpy,Matplotlib都是考的基础,但是,半决赛要求的大数据我好多都还没学!悲催的我才转行三个月,so,上面的知识我后面比赛完了补充!
# 查看类型
a= np.linspace(1,10,10)
print(a)
# 查看数据的类型
print(type(a))
# 查看数组中的数据类型 dtype
print(a.dtype)
# 查看形状 返回一个元组
print(a.shape)
#查看元素的数目
print(a.size)
# 查看数组的维度
print(a.ndim)
a[-2:,-2:]
更好