Numpy教程

numpy教程

借助了较多网络资源,总结一下,共同学习!

Numpy包括:

  • 一个N维数组对象array

  • 成熟的广播函数库

  • 用于整合C和c++的工具包

  • 一些线性代数、傅里叶变换和随机数生成函数。

Numpy提供了高级的数值编程工具,如:矩阵数据类型、矢量处理等。

1.Numpy基本操作

1.1 列表与矩阵的转化

import numpy as np
#多行的矩阵
array=np.array([
    [1,3,5],
    [4,6,9]
])
#单行矩阵
array1=np.array([1,2,3])
print(array)
print(array1)

1.2 维度

维度使用array.ndim进行调用,指的是行数。

print(array.ndim)

1.3 行数和列数

使用array.shape直接进行输出

print(array.shape)

1.4 元素个数

使用array.size进行输出

print(array.size)

2. Numpy数组创建

2.1 一维数组创建

a=np.array([xxx,xxx],dtype=?)
#dtype可省略
print(a.dtype)

2.2 多维数组创建

b=np.array([
    [x,x,x],[y,y,y,],...
]
)

2.3 零数组创建

zeros((行数,列数))

行数列数使用括号包围

c=np.zeros((3,4)

2.4 一数组创建

ones((行数,列数))

可以指定数据类型

d=np.ones((3,4))

2.5 空数组创建

empty((行数,列数))

每个值都接近于0

e=np.empty((3,4))

2.6 连续数组创建

arange(start,end+1,step)

start为初始位置,end+1为结束位置下一位,step为步长

或者

arange(num) 创建从0到num-1的连续数组

f=np.arange(10,21,2)

2.7 reshape操作

reshape((x,y))修改成x行y列的数组

g=f.reshape((3,4))

如果修改后的数组无法包含原数组的内容,则会报错。

2.8 创建连续性数据

linspace(start,end,number)

从start到end分成number个线段型数据,即创建了一个等差数列。

h=np.linspace(1,10,20)
print(h)
#[ 1.          1.47368421  1.94736842  2.42105263  2.89473684  3.36842105
#  3.84210526  4.31578947  4.78947368  5.26315789  5.73684211  6.21052632
#  6.68421053  7.15789474  7.63157895  8.10526316  8.57894737  9.05263158
#  9.52631579  10.        ]

使用linspace创建的数据可以使用reshape进行处理。

3. Numpy基本运算

3.1 一维array运算

直接对应项进行运算操作,如+,-,*,**平方等。

numpy包含了许多数学函数工具,如sin等。

可以使用>,<,==等进行比较,对数组中每一项都进行比较操作。

a=np.array([10,20,30,40])
b=np.arange(4)
print(a-b)
print(a*b)
print(a.dot(b))  #对应项相乘后相加
print(b**2)      #每一项进行平方操作
print(np.sin(a))

print(a>4)
print(a==b)

3.2 多维array运算

多维的矩阵乘法:使用dot函数
c=a.dot(b)
d=np.dot(a,b)
#以上两种形式都可以进行矩阵乘法运算
np.random

np.random.random创建随机的浮点数,在[0.0,1.0)。

np.min,max

输出数组中的最小最大值

np.sum

对数组中元素进行求和

如果需要对行或列进行查找运算,就在上述代码中加入axis进行赋值。

如np.sum(a,axis=?) axis=0则以列进行查询 axis=1则以行进行查询

3.3 基本计算

最小元素索引

np.argmin

最大元素索引

np.argmax

求整个矩阵的均值

np.mean 或 ?.mean()

求平均值

np.average

求中位数

np.median

累加

np.cumsum

累差

np.diff

nonzero函数:

https://blog.csdn.net/zhihaoma/article/details/51235016

B = np.array([[3,5,9],
              [4,8,10]])
C = np.array([[0,5,9],
              [4,0,10]])
print(np.nonzero(B))
print(np.nonzero(C))
#out:
#(array([0, 0, 0, 1, 1, 1], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))
#(array([0, 0, 1, 1], dtype=int64), array([1, 2, 0, 2], dtype=int64))
仿照列表排序

np.sort()

矩阵转置

np.transpose()或 ?.T

三维以上数组的转置

截取

np.clip(Array,min,max)

保留位于min和max之间的元素,并使用max、min分别替换大于和小于边界的值。

4 numpy索引和切片

调用

通过数组名+[?]进行调用

list切片

在调用时加入切片信息,例如A[1,1:3]或B[1:4]

多维转一维

array.flatten()

flat是一个迭代器,本身是一个object属性

切片

在这里插入图片描述
在这里插入图片描述

5.numpy array合并

5.1数组合并

上下合并
import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
print(np.vstack((A,B)))
左右合并
D = np.hstack((A,B))
print(D)

5.2 数组转置为矩阵

import numpy as np
A = np.array([1,1,1])
print(A)
print(A.shape)

[1 1 1]
(3,)#此时A为一个数组或数列


#变成行矩阵
print(A[np.newaxis,:]) # [1 1 1]变为[[1 1 1]]
print(A[np.newaxis])

[[1 1 1]]

print(A[np.newaxis,:].shape) # (3,)变为(1, 3)


#变成列矩阵
print(A[:,np.newaxis])
 
[[1]
 [1]
 [1]]

print(A[:,np.newaxis].shape)

(3, 1)

5.3 多个矩阵合并

矩阵合并使用concatenate函数

import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])

A = A[:,np.newaxis] # 数组转为列矩阵
B = B[:,np.newaxis] # 数组转为列矩阵

# axis=0纵向合并
C = np.concatenate((A,B,B,A),axis=0)
print(C)

[[1]
 [1]
 [1]
 [2]
 [2]
 [2]
 [2]
 [2]
 [2]
 [1]
 [1]
 [1]]

# axis=1横向合并
C = np.concatenate((A,B),axis=1)
print(C)

[[1 2]
 [1 2]
 [1 2]]
a = np.arange(8).reshape(2,4)
b = np.arange(8).reshape(2,4)
# axis=0多个矩阵纵向合并
c = np.concatenate((a,b),axis=0)

[[0 1 2 3]
 [4 5 6 7]
 [0 1 2 3]
 [4 5 6 7]]

# axis=1多个矩阵横向合并
c = np.concatenate((a,b),axis=1)
[[0 1 2 3 0 1 2 3]
 [4 5 6 7 4 5 6 7]]

补 :数组拼接与Concatenate函数

  • 将数组转化成list,然后使用list的append或extend函数,适用于简单的一维数组

    import numpy as np
    a=np.array([1,2,3])
    b=np.array([4,5,6])
    a_list=list(a)
    b_list=list(b)
    a_list.extend(b_list)
    a=np.array(a_list)
    
  • 使用numpy.append(arr,values,axis=none)函数,将一个数组和一个数值,或两个数组拼接。

    import numpy as np
    a=np.array([1,2,3])
    b=np.array([7,8])
    c=np.append(a,b)
    
  • 通过numpy.concatenate((a1,a2),axis=0)函数,完成多个数组的拼接,a1,a2…为数组类型的参数

    #一维数组拼接
    import numpy as np
    a=np.array([1,2,3])
    b=np.array([11,22,33])
    c=np.array([44,55,66])
    d=np.concatenate((a,b,c),axis=0)
    #二维数组拼接
    a=np.array([[1,2,3],[1,2,3]])
    b=np.array([[11,22,33],[11,22,33]])
    d=np.concatenate((a,b),axis=0)
    >>>[[ 1  2  3][ 1  2  3][11 22 33][11 22 33]]
    #如果axis=1,则输出[[ 1  2  3 11 22 33][ 1  2  3 11 22 33]]
    

6. numpy array分割

6.1 reshape方法

6.2 等量分割

利用split函数进行分割

np.split()

parameters:

  • array:待切割的数组

  • indices_or_sections : int or 1-D array

    如果参数是个integar N,array将沿axis方向分割成N个等同array,如果不能分割则报错。

    如果参数是1-D array of sorted integars,表明按照给出数组中的数值沿axis方向进行分割

    ​ For example,
    [2, 3] would, for axis=0, result in

    ​ - ary[:2]
    ​ - ary[2:3]
    ​ - ary[3:]

    ​ If an index exceeds the dimension of the array along axis,
    ​ an empty sub-array is returned correspondingly.

  • axis:

    分割的方向,默认为0

import numpy as np
A = np.arange(12).reshape((3,4))

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

# 等量分割
# 纵向分割同横向合并的axis
print(np.split(A, 2, axis=1))

[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]

# 横向分割同纵向合并的axis
print(np.split(A,3,axis=0))

[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]

6.3 不等量分割

np.array_split()
print(np.array_split(A,3,axis=1))


[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2],
       [ 6],
       [10]]), array([[ 3],
       [ 7],
       [11]])]

6.4 其他分割方式

np.vsplit() 横向分割

np.hsplit() 纵向分割

# 横向分割
print(np.vsplit(A,3)) # 等价于print(np.split(A,3,axis=0))

# 纵向分割
print(np.hsplit(A,2)) # 等价于print(np.split(A,2,axis=1))

7.numpy copy 和 =

使用=复制会带有关联性,使用copy复制不会带有关联性

8.广播机制

数组间的基本运算是一对一,即a,b形状相同,当两者不同时就会触发广播机制。

from numpy import array
a = array([[ 0, 0, 0],
           [10,10,10],
           [20,20,20],
           [30,30,30]])
b = array([0,1,2])
print(a+b)


[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]

当两个array尾部维度兼容时即可以使用广播机制。

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

类似于使用np.title将b进行修改。

b = np.tile([0,1,2],(4,1))
print(a+b)

[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]

在这里插入图片描述
在这里插入图片描述

9.常用函数

9.1 np.bincount()

基本形式

统计索引出现的次数

从0到x中最大值

x = np.array([1, 2, 3, 3, 0, 1, 4])
np.bincount(x)

array([1, 2, 1, 2, 1], dtype=int64)
添加weight参数

给定weight数组,对于x中的每一个数出现的索引值,去weight中去寻找对应索引值并进行加和。

例如,x —> [1, 2, 3, 3, 0, 1, 4],w —> [0.3,0.5,0.7,0.6,0.1,-0.9,1], 索引 0 出现在x中index=4位置,那么在w中访问index=4的位置即可,w4=0.1

索引 1 出现在x中index=0与index=5位置,那么在w中访问index=0index=5的位置即可,然后将两这个加和,计算得:w[0]+w[5]=-0.6 其余的按照上面的方法即可!

bincount的另外一个参数为minlength,当所给的minlength多于实际从x中得到的索引数量后,后面没有访问到的设置为0即可。

w = np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1])
np.bincount(x,weights=w)

#array([ 0.1, -0.6,  0.5,  1.3,  1. ])

np.bincount(x,weights=w,minlength=7)
#array([ 0.1, -0.6,  0.5,  1.3,  1. ,  0. ,  0. ])

9.2 np.argmax()

argmax(a, axis=None, out=None)

返回沿轴axis最大值的索引

x = [[1,3,3],
     [7,5,2]]
#axis=0 按列
print(np.argmax(x,axis=0))
#[1 1 0]

x = [[1,3,3],
     [7,5,2]]
#axis=1 按行
print(np.argmax(x,axis=1))
#[1 0]

x = [[1,3,3],
     [7,5,2]]
print(np.argmax(x))
# 3

9.3 求取精度

np.around([xxxx],decimal=?)

decimal为正数时代表小数点后面的位数

np.around([-0.6,1.2798,2.357,9.67,13], decimals=0)#取指定位置的精度
	#array([-1.,  1.,  2., 10., 13.])
np.around([1.2798,2.357,9.67,13], decimals=1)
	#array([ 1.3,  2.4,  9.7, 13. ])
    
np.around([1,2,5,6,56,55], decimals=-1)
#array([ 0,  0,  0, 10, 60, 60])
#超过五时进行进位
np.around([1,2,5,50,56,190], decimals=-2)
#array([  0,   0,   0,   0, 100, 200])
#超过50时进行进位

其他

取整

np.floor

取上限

np.ceil

查找

利用np.where实现小于0的值用0填充,大于0的数不变

x = np.array([[1, 0],
       [2, -2],
     [-2, 1]])
print(x)

[[ 1  0]
 [ 2 -2]
 [-2  1]]

np.where(x>0,x,0)

array([[1, 0],
       [2, 0],
       [0, 1]])
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值