numpy提供了一种核心的数据类型,为N维数组类型——ndarry
数组的创建
自定义数组array() 通过列表传递数组
import numpy as np
a =np.array([1,2,3,4])
b = np.array([[1,2],[3,4]])
print(a)
print(b)
---------
[1 2 3 4]
[[1 2]
[3 4]]
---------
注意:
必须传入列表一个列表,np.array([1,2],[3,4])会报错
二维数组需保证每个列表内的元素个数相同,不会自动填充空值。
递增数组 arange() 同range()
arange(启示值,终止值,步长)
range步长为整数型
arange步长可为浮点型,且
a = np.arange(1,10,0.5)
print(a)
print(type(a))
--------------
[1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5]
<class 'numpy.ndarray'>
初始化数组 one/one_like 创建一个值全为1的数组
a = np.ones(shape = (10,2)) #创建一个10行两列,值全部为1的数组
b = np.ones_like(a)
print(a)
print(b)
------------------
[[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]]
[[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]]
函数 | 描述 |
ones/ones_like | 初始化为1的数组 ones(shape =(行数,列数)) ones_like(ndarray对象) |
zero/zeros_like | 初始化为0的数组 |
empty/empty_like | 未初始化的值 |
full/full_like | 初始化为填充值 full(shape=(行数,列数),fill_value='文本或数字') full((5,2),'文本或数字') |
什么是未初始化的值?31:32
数组(ndarry)和列表(list)
list科存储不同type的元素,ndarry只能储存相同type的元素
list需要单独取数出来计算(通过循环),ndarry可进行矢量化运算及广播计算
ndarry存储空间小,计算速度快
*广播计算
2*3的列表如何与1*3的列表进行计算?将1*3的列表向下复制填充为2*3的列表即可。
相关属性
ndim 返回数组维度
shape返回数组形状,边界
a = np.array([[1,2,3,2],[3,4,5,6],[5,5,6,7]])
print(a.shape)
print(type(a.shape))
print(a.shape[0]) #打印a有几行
print(a.shape[1]) #打印a有几列
------------------
(3, 4)
<class 'tuple'>
3
4
dtype 返回数据类型
ndarray 的存储只能为同一数据类型
数据类型:
在创建数组时,可以用dtype来只id那个元素类型,
如果没有指定,则会根据元素类型自行推断
前后顺序影响数据类型
size 返回数组中所有元素的个数
itemsize 返回数组中每个元素占用的空间大小
相关方法
astype() 对ndarray进行数据转换
此函数不会对原对象进行修改,而是返回一个新的对象
a = np.array([[1,2,3,2],[3,4,5,6],[5,5,6,7]])
print(a.astype(np.cfloat))
print(a.dtype)
------------
[[1.+0.j 2.+0.j 3.+0.j 2.+0.j]
[3.+0.j 4.+0.j 5.+0.j 6.+0.j]
[5.+0.j 5.+0.j 6.+0.j 7.+0.j]]
int32
reshape()
a = [1,2,3,4,5,6,7,8,9,0,1,2]
np.reshape(a,(3,4))
print(np.reshape(a,(3,4)))
print(type(np.reshape(a,(3,4))))
-------------------
[[1 2 3 4]
[5 6 7 8]
[9 0 1 2]]
<class 'numpy.ndarray'>
numpy中,很多方法和函数都是通用的
上述例子中,a 为一个列表,非ndarray对象,所以采用np.shape(对象,(行数,列数))方法
如果某arr为ndarray对象,可直接用arr.reshape()来进行处理
元素访问
索引与切片
取单行:a[1]
取连续多行:a[0:2]
取不连续的多行:a[[0,1,3]]
取单列:a[:,0]
取连续多列:a[:,0:2]
取不连续多列:a[:,[0,1,3]]
取多个不相邻的点a[[0,1],[2,3],[3,4]]
a = [1,2,3,4,5,6,7,8,9,0,1,2]
b = np.reshape(a,(3,4))
print(b)
print(b[1,2])
print(b[0:2,1:3])
print(b[0:2,2])
--------------
[[1 2 3 4]
[5 6 7 8]
[9 0 1 2]]
7
[[2 3]
[6 7]]
[3 7]
整数数组进行索引
布尔数组进行索引
提供一个布尔类型的数组b,来对目标数组a进行索引,如果b中的值为true,则选取a中的元素,如果为false,则不选取
a[(a>10) & (a<12)]
当为多条件时,使用&和|并用括号分块,取反为~
1、选择大于10的数字
2、将所有大于10的数字都设置为0
a = np.reshape([1,2,3,400,5,1111,7,8,9,0,1,2],(3,4))
b = a[a>10]
print(b)
----------
[ 400 1111]
a = np.reshape([1,2,3,400,5,1111,7,8,9,0,1,2],(3,4))
a[a>10] = 0
print(a)
-----------
[[1 2 3 0]
[5 0 7 8]
[9 0 1 2]]
扁平化
np.ravel/ravel 返回视图,如果对新元素进行修改,原数组内的值也会修改
a = np.array([[1,2,3],[4,5,6]])
b = a.ravel()
print(a.ravel())
print(a)
b[1] = 100
print(a)
-----------------------
[1 2 3 4 5 6]
[[1 2 3]
[4 5 6]]
[[ 1 100 3]
[ 4 5 6]]
flatten 返回拷贝 如果对新元素进行修改,原数组内的值不会修改
order参数
reshape、array中,都存在order参数,尤其是reshape,其原理是先将原数组扁平化,再进行重排。
order分为"C"模式和"F"模式
C模式是从左到右,依次存储。()
F模式是从上到下,依次存储
通用函数ufunc(universal function)
numpy是python计算的矢量化版本
abs/fabs
ceil/floor 往上取整/往下取整
统计函数(聚合函数)
mean/sum 平均值/求和
max/min
argmax/argmin 最大值所在的索引的位置,最小值所在的索引的位子
std/var
cumsum/sumprod
重点:以上函数都可通过axis控制按行或者按列统计
a = np.array([[1,2,3],[4,5,6]])
print(a.sum(axis=0))
-------------
[5 7 9]
数组的连接与拆分
np.concatenate((a,b,c,d),axis = 0)
对多个数组按指定轴的方向进行连接
np.vstack/np.hstack
对数组进行连接 vstack 相当于concatenate(axis = 0) hstack相当于concatenate(axis = 1)
np.split(ary,indices_or_sections,axis = 0)/np.vsplit/np.hsplit
当indices_or_sections为一个数字时,表示等分
当为列表时,表示按固定行/列切片
其他函数(方法)
np.transpose
np.sort/x.sort np.sort()会返回一个新数组,x.sort不会对原对象进行修改
argsort返回原数组中排序的角标(应用:根据索引提取元素)
a = np.array([2,3,1,10,4])
print(a)
print(np.sort(a))
print(np.argsort(a))
print(a[np.argsort(a)[-2:]])
----------------
[ 2 3 1 10 4]
[ 1 2 3 4 10]
[2 0 1 4 3]
[ 4 10]
unique 去重且进行升序排列
np.where 类似if语句
np.where(condition,[x,y]) 当条件为真,返回x,反之返回y
np.where(x>y,x,y)
a = np.array([2,3,1,10,4])
b = np.array([109,2,0,222,3])
print(np.where(a>b,a,b))
-----------------
[109 3 1 222 4]
np.save(file: str, arr: Union[ndarray, Iterable, int, float])
np.load(file: str)
np.savetxt() 文本存储只能保存一维及二维的数据
np.loadtxt()