numpy基础知识

一、numpy简介

  numpy是一个在Python中做科学计算的基础库。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。

  优点:快捷,方便

二、Ndarray对象

NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型。ndarray中的每个元素在内存中使用相同大小的块, ndarray中的每个元素是数据类型对象的对象(称为 dtype

三、numpy创建数组

1、首先需要导入numpy

import numpy as np

2、接着创建数组

import numpy as np
a = np.array([1,2,3,4])
b = np.arange(1,5)

#arange用法:arange([start,] stop[, step,],dtype=None)

a,b输出结果:
[1,2,3,4]

3、数组类名

import numpy as np
a = np.array([1,2,3,4])
print(type(a))

#输出:
numpy.ndarray

4、数据的类型(可以自己设,也astype修改)

import numpy as np
a = np.array([1,2,3,4])
print(a.dtype)

#输出:
int32
import numpy as np
a = np.array([1,2,3,4]).astype("int64")
print(a.dtype)

a = np.array([1,2,3,4],dtype="int64")

#输出:
int64

5、设置维度(ndmin)

import numpy as np
a = np.array([1,2,3,4],ndmin=1).astype("int64")

补充:更多numpy中常见的数据类型

四、数组的形状

简单来说就是数组由几行几列构成,例如(a,b)表示a行b列的一个数组,.shape可以查看形状,输出形式为元组

import numpy as np
a = np.array([[1,2,3,4],
             [5,6,7,8]])
print(a.shape)

#输出:
(2,4)

.reshape可以修改形状,特别地,若想展开为一维数组,可用.flatten(),不需要传入行数或者列数

import numpy as np
a = np.array([[1,2,3,4],
             [5,6,7,8]]).reshape((4,2))
print(a)
print(a.shape)
print(a.flatten())

#输出:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
(4, 2)
[1 2 3 4 5 6 7 8]

应用:在数组特别大或者想要单独取行或列进行运算时,可以通过shape指定进行行或列的选中,例如后续将nan替换为平均值或中值时,需要指定计算某行或某列的平均值或中值,此时,.shape[0]表示选中行,.shape[1]表示选中列。

*注意:axis表示轴,对于二维数组,axis=0表示行,axis=1表示列,

                                 对于三维数组,有0,1,2轴,axis=0表示块,axis=1表示行,axis=2表示列

五、数组和数组/数的计算(广播机制)                       

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

在计算上,简单来说,就是当数组与数相加,或者数组与另一个行或列能够对应数组相加时,所有数字都会进行运算。具体理解见下例

1、数组与数的计算

import numpy as np
a = np.array([[1,2,3,4],
             [5,6,7,8]])
b = a+3
print(b)

c = a*3
print(c)

#输出:
b : [[ 4  5  6  7]
 [ 8  9 10 11]]

c : [[ 3  6  9 12]
 [15 18 21 24]]

数字会与数组里的每一个数进行运算

2、数组与数组的计算

import numpy as np
a = np.array([[1,2,3,4],
             [5,6,7,8]])
b = np.array([[1],
              [2]])
ans1 = a+b
print(ans1)

ans2 = a*b
print(ans2)

#输出:
[[ 2  3  4  5]
 [ 7  8  9 10]]
[[ 1  2  3  4]
 [10 12 14 16]]

数组的对应位置会进行运算,但若位置不对应就会报错

import numpy as np
a = np.array([[1,2,3,4],
             [5,6,7,8]])
b = np.array([[1],
              [2],
              [3]])
ans1 = a+b
print(ans1)

#输出:
Traceback (most recent call last):
  File "---------------", line 184, in <module>
    ans1 = a+b
           ~^~
ValueError: operands could not be broadcast together with shapes (2,4) (3,1) 

六、numpy读取数据

np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

参数解释
frame文件、字符串或产生器,可以是.gz或bz2压缩文件
dtype数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认np.float
delimiter分隔字符串,默认是任何空格,使用时可以改为逗号
skiprows跳过前n行,一般跳过第一行表头
usecols读取指定的列,索引,元组类型
unpack如果True,读入属性将分别写入不同数组变量,False读入数据只写入一个数组变量,默认False

*注意:unpack默认为False(0),也就是数据怎样,导入就是怎样

            若为True(1)原数据的行变成列,列变成行,也就是转置

  转置

  在对角线防线交换数据,目的是为了更好处理数据

    1).transpose()

import numpy as np
a = np.array([[1,2,3,3,2,1],
             [5,6,7,7,6,5],
             [8,9,0,0,9,8]])

print(a)
print(a.transpose())

#输出:
[[1 2 3 3 2 1]
 [5 6 7 7 6 5]
 [8 9 0 0 9 8]]
[[1 5 8]
 [2 6 9]
 [3 7 0]
 [3 7 0]
 [2 6 9]
 [1 5 8]]

    2).swapaxes(1,0)(二维数组时)

import numpy as np
a = np.array([[1,2,3,3,2,1],
             [5,6,7,7,6,5],
             [8,9,0,0,9,8]])

print(a)
print(a.swapaxes(1,0))

#输出:
[[1 2 3 3 2 1]
 [5 6 7 7 6 5]
 [8 9 0 0 9 8]]
[[1 5 8]
 [2 6 9]
 [3 7 0]
 [3 7 0]
 [2 6 9]
 [1 5 8]]

    3).T

import numpy as np
a = np.array([[1,2,3,3,2,1],
             [5,6,7,7,6,5],
             [8,9,0,0,9,8]])

print(a)
print(a.T)

#输出:
[[1 2 3 3 2 1]
 [5 6 7 7 6 5]
 [8 9 0 0 9 8]]
[[1 5 8]
 [2 6 9]
 [3 7 0]
 [3 7 0]
 [2 6 9]
 [1 5 8]]

以上方法均可实现转置,效果相同

七、numpy的索引和切片

  1、取一行或一列

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


a[1] #表示取第二行
a[:,2]表示取第三列

  2、取多行或多列

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

a[1:3] #表示取第二行到第四行的所有值
a[:,2:4] #表示取第三到第五列的所有值

*注:若要修改某个值,直接向索引的目标赋值即可:a[:,2,4] = 0

  3、布尔索引

  常用于进行修改numpy中的某些符合条件的值

a[a<5] = 0 #表示将a中小于5的值全部修改为0

  4、numpy中的三元运算符

  用where完成

np.where(a<5,0,5) #表示将小于5的修改为0,大于5的修改为5

5、numpy中的clip

a.clip(5,10) #表示将小于5的替换为5,大于10的替换为10,其他不变

*注意:clip无法将nan与inf进行修改

八、numpy中的nan与inf

  nan:(not a number)表示不是数字,例如读取文件的确实或做了不合适运算

  inf:(infinity)表示无穷,例如某个数字除以0时会出现

  *注:nan与inf均为float类型

  nan

  1)两个nan是不相等的,也就是np.nan!=np.nan

  2)利用1)可以判断nan的个数,具体代码如下

  

np.count_nonzero(a!=a)

  3)通过判断是不是nan,并将其返回bool类型,实现nan的替换

  

a[np.isnan(a)] = 0 #将所有nan替换为0

  **注:一般不将nan替换为0而是均值或者中值

九、numpy中常用的统计函数

求和a.sum(axis = None)
均值a.mean(axis = None)
中值np.median(a,axis = None)
最大值a.max()
最小值a.min()
极值np,ptp(a,axis = None)
标准差a.std(axis = None)

  补充说明:均值

  

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

print(a.mean())
print(a.mean(axis = 0))
print(a.mean(axis = 1))

#输出:
5.0
[4. 5. 6.]
[2. 5. 8.]

十、数组的拼接

  1、竖直拼接:np.vstack

import numpy as np
a = np.array([[ 0, 1, 2, 3, 4, 5],
       [ 6, 7, 8, 9, 10, 11]])
b = np.array([[12,13,14, 15,16,17],
       [18,19,20,21,22, 23]])

print(np.vstack((a,b)))

#输出:
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

  2、水平拼接

import numpy as np
a = np.array([[ 0, 1, 2, 3, 4, 5],
       [ 6, 7, 8, 9, 10, 11]])
b = np.array([[12,13,14, 15,16,17],
       [18,19,20,21,22, 23]])

print(np.hstack((a,b)))

#输出:
[[ 0  1  2  3  4  5 12 13 14 15 16 17]
 [ 6  7  8  9 10 11 18 19 20 21 22 23]]

十一、更多

  1、创建一个全0的数组: np.zeros((4,6))

  2、创建一个全1的数组: np.ones((2,4))

  3、创建一个对角线为1的正方形数组(方阵):np.eye(5)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值