【Python】Numpy包 ndarray方法 经验分享

感觉学习的主要是函数的用法,一些简单功能的实现,以及一些函数的使用逻辑

一、查看帮助文档

import numpy as np
help(np.array)//使用help()函数,如果需要查看的是某个包里面的,需要先导入,后根据导入的语句变换help()括号内的内容
# from numpy import *
# help(array)
import numpy as np
np.array?//在函数名后使用问号

二、Numpy ndarray创建方法(4)

  1. 利用Python的列表创建数组(np.array())
    np.array(object[, 数组元素的数据类型 = None][, 对象是否需要复制 = True], order = None, subok = False, 生成数组的最小维度 = 0)

object 数组或嵌套的数列
order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok 默认返回一个与基类类型一致的数组

import numpy as np
np.array([1,2,3,4,5,6],'float')#利用python的列表类型直接创建ndarray
  1. 创建数组且其中所有元素相同的
    np.(数组元素个数, dtype=‘类型’),可填入ones,zeros,指创建的数组内部元素分别是1,0;如果填入full,则变为np.(数组元素个数, 填充物字符),用填充物字符作为元素创建数组
a = np.zeros(10, dtype='int')
print(a.dtype, a)
a = np.ones(10,dtype='float') 
print(a.dtype, a)
a = np.full((3,5),'i love u')
print(array1)
'''
输出三行五列数组
[['i love u' 'i love u' 'i love u' 'i love u' 'i love u']
 ['i love u' 'i love u' 'i love u' 'i love u' 'i love u']
 ['i love u' 'i love u' 'i love u' 'i love u' 'i love u']]
 '''
  1. 创建线性序列数组
    np.arange([起始数(包括),] 终止数(不包括)[, 步长,], dtype=None)
    划定范围后根据步长切元素的一个函数,元素个数由数字范围差值/步长得到
    np.linspace(start, stop, 要求的数组应有的元素=50, endpoint=True, retstep=False, dtype=None)
    划定范围后按照要求的元素个数均匀切割,元素个数明确确定,间接得到步长。
a = np.arange(0,20,4,)
print(a)
> array([ 0,  4,  8, 12, 16])
a = np.linspace(0,20,4,)
print(a)
> array([ 0.        ,  6.66666667, 13.33333333, 20.        ])//0~20均匀分成4个数字作为数组元素
  1. 创建与随机数有关的数组
    np.random是一个模块,调用该模块下的功能可以创建元素符合一定分布的数组。
    np.random.randint(起始数字,终止数字,数组元素个数)
    np.random.random(数组元素个数)
    np.random.normal(均值,方差,数组元素个数)
//np.random.randint(起始数字,终止数字,数组元素个数)
np.random.randint(0,10,(3,3))
array([[7, 3, 2],
       [3, 6, 1],
       [0, 2, 8]])
//创建0~10区间内的随即整型3*3数组
//np.random.random(数组元素个数)
np.random.random((2,2))
array([[0.3355943 , 0.00926364],
       [0.29189079, 0.05479657]])
//创建2*2的数组,元素符合0~1均匀分布
//np.random.normal(均值,方差,数组元素个数)
np.random.normal(0,1,(3,3))
array([[ 1.26104413, -0.75845668,  1.40374373],
       [-0.49270628, -1.84310192, -0.10160905],
       [-0.21291316,  0.40893748,  0.17161528]])
//创建符合mean=0,std=1的正态分布的3*3数组,其中mean和std必填没有默认值
  1. 复杂的结构化数组创建
    (1)字典:
#复杂的结构化数组创建
#通过采用字典或元组列表的方法,制定符合数据类型,构造结构化数组
import numpy as np
data=np.zeros(3,dtype={'names':('name','age'),'formats':('U10','i4')})#U10指长度不超过10的unicode字符串;i4指的是4字节的整型
print(data)
[('', 0) ('', 0) ('', 0)]

现在我们正式运用这种方法创建一个学校老师的数组

teacher_name = ['Zames','Manchester','Li','Jyx']
teacher_age  = [30,29,28,27]
teacher_marriage=['F','T','F','T']
teachers=np.zeros(4,dtype={'names':('name','age','marriage'),'formats':('U10','i4','U2')})
teachers['name']=teacher_name#要记得用单引号
teachers['age']=teacher_age
teachers['marriage']=teacher_marriage
print(teachers)
print('The age of Zames is:',teachers[teachers['name']=='Zames']['age'])
[('Zames', 30, 'F') ('Manchester', 29, 'T') ('Li', 28, 'F')
 ('Jyx', 27, 'T')]
The age of Zames is: [30]

(2)元组列表
创建的语句直接改成下面的元组形式就好了

teachers=np.ones(4,dtype=[('name','U10'),('age','i4'),('marriage','U2')])

三、Numpy ndarray属性的基本操作(6)

数组的属性包括:ndim(维度),shape(每个维度的大小),size(总元素个数),dtype(元素的数据类型),itemsize(每个元素的字节大小),dbytes(总字节大小)。可以认为itemsize*size=dbytes。

三、Numpy ndarray切片与索引
索引是获取数组的单个元素,切片则是获取数组的子数组。
用逗号表示分隔索引或切片的维度

# 索引与切片
import numpy as np
a = np.arange(11,20).reshape(3,3)
print(a)
print(a[0])  # 0页
print(a[0][0])  # 0页 0行
print(a[0][0][0])  # 0页 0行 0列
print(a[0, 0, 0])  # 0页 0行 0列   等效于上一行的代码,即逗号可以用于分隔不同的维度
#要注意的是,索引的维度顺序是不变的,先填前一个维度,后面的维度才可以填

引号在切片中使用,用于分隔区间的两侧和步长

import numpy as np
a = np.arange(1, 10)
print(a[-4:-7:-1])
#从第-4个位置到-7位置,按步长为-1(默认为1)来选:
#-4位置指的是数组从后往前数第4个,先从这个位置开始,按步长-1提取数,即每次从后往前再数1个数,一直到-7位置(则是从后往前数第7个)
[6 5 4]

举几个切片的例子,注意索引和切片数字的含义有区别。

a = np.arange(1, 10)
a = a.reshape(3, 3)
print(a)
print(a[:2, :2])
print(a[:, 1])  # 第二个位置是指定列为{1]的位置
print(a[:, 2])  # 所有行的最后一列,与切片中数字的含义不一样,如果是切片,则'2'通常代表到第2列,这里直接是索引到了列为【2】的位置
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[1 2]
 [4 5]]
[2 5 8]
[3 6 9]

四、 数组的变形

  1. 可以使用reshape函数改变原有数组的维度
a = np.arange(1,9)
b = a.reshape((2,4))
#或者np.reshape(a,(2,4),order='c')
print(b)
[[1 2 3 4]
 [5 6 7 8]]
  1. 数组的合并与分裂
    三维数组的三个维度代表字母:垂直v(或0),水平h(或1),深度d(或2)
    合并stack,分裂split
#在深度方向a与b并起来
np.dstack((a, b))#格式都是代表字母+操作名称
#把c数组在深度方向拆成2个
np.dsplit(c, 2)

通用的办法需要使用concatenate()函数(合并)和split()函数(分裂)

concatenate((a1, a2, ...), axis=0, out=None)
np.split(ary, indices_or_sections, axis=0)

axis=0,1,2,分别代表垂直、水平和深度(页)

a = np.arange(1, 10)
a = a.reshape(3, 3)
v_split = np.split(a,3,axis=0)
h_split = np.split(a,3,axis=1)
print(a)
print('v_split\n',v_split)
print('h_split\n',h_split)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
v_split
 [array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]
h_split
 [array([[1],[4],[7]]), array([[2],[5],[8]]), array([[3],[6],[9]])]

合并时用的轴跟分裂时一样

x1,x2,x3 = np.split(a,3,axis=1)
np.concatenate((x1,x2,x3),axis =1)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
  1. 填补数组
    np.pad(array, pad_width, mode, **kwargs)
    mode常用的有constant, median,mean,minimum等
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
b = np.array([6, 7, 8, 9])
b = np.pad(b, pad_width=(5,0), mode='constant',constant_values=-1)
#pad_width指的是要在头部和尾部补上的元素个数
#mode 代表要补充的是常数,常熟为-1
print(b)

五、Numpy ndarray 数据统计

b = np.array([1, 2, 3, 4, 5],dtype='int')
#, 6, 7, 8, 9
mean=b.mean()#求均值
print('mean',mean)
average=np.average(b)#求完全平均数
print('average',average,end="  ")
average2=np.average(b,axis=0,weights=[0.2,0.2,0.2,0.2,0.2])#按照全手打的权重数组进行加权平均,这里相当于完全平均数
weights=np.linspace(0,1,5)
average3=np.average(b,axis=0,weights=weights)#按照创建的数组加权平均
print('average2:',average,' ','average3:',average3)
print('max',np.max(b))# 最大值
print('最大值是第',np.argmax(a)+1,'个')# 返最大值的下标
print('最小值在第',np.argmin(a)+1,'个')	# 返回一组数据最小值的下标
print('min',np.min(b))# 最小值
print('max-min',np.ptp(b))# 极差
median=np.median(b)
print('median',int(median))
print('总体标准差',np.std(b))#总体标准差
print('样本标准差',np.std(b,ddof=1))#样本标准差

mean 3.0
average 3.0  average2: 3.0   average3: 4.0
max 5
最大值是第 9 个
最小值在第 1min 1
max-min 4
median 3
总体标准差 1.4142135623730951
样本标准差 1.5811388300841898

线性拟合和统计学协方差部分内容可以参见:Numpy 学习日志

举一个使用random模块来解决统计学题目的例子
Suppose we have a list of the daily energy intake for 11 women in Kj :
[5260., 5470, 5640, 6180, 6390, 6515, 6805, 7515, 7515, 8230, 8770]
Does their energy intake deviate systematically from the recommended
value of 7725 kJ?

ndarrayPython中的一种多维数组,可以用来存储和操作大量的数值数据。它具有许多有用的属性和方法,可以让用户更容易地处理数据。`numpy.ndarray` 是 NumPy 库中的一个类,用于表示 N 维数组(即多维数组)。它是 NumPy 的核心数据结构之一,提供了许多高效的操作,例如数组索引、切片、算术运算、数学函数等等。 在使用 `numpy.ndarray` 时,通常需要先导入 NumPy 库,然后通过 `numpy.array()` 函数将 Python 列表或元组转换成 N 维数组,例如: ```python import numpy as np # 从列表创建一个一维数组 a = np.array([1, 2, 3]) print(a) # 输出:[1 2 3] # 从元组创建一个二维数组 b = np.array([(1, 2, 3), (4, 5, 6)]) print(b) # 输出: # [[1 2 3] # [4 5 6]] ``` 可以通过 `ndarray.shape` 属性获取数组的维度信息,通过 `ndarray.dtype` 属性获取数组元素的数据类型,例如: ```python # 获取数组的形状 print(a.shape) # 输出:(3,) print(b.shape) # 输出:(2, 3) # 获取数组元素的数据类型 print(a.dtype) # 输出:int64 print(b.dtype) # 输出:int64 ``` 还可以使用各种方法对数组进行操作,例如: ```python # 数组加法 c = a + b print(c) # 输出: # [[2 4 6] # [5 7 9]] # 数组乘法 d = a * b print(d) # 输出: # [[ 1 4 9] # [ 4 10 18]] # 数组转置 e = b.T print(e) # 输出: # [[1 4] # [2 5] # [3 6]] ``` 这些只是 `numpy.ndarray` 类提供的一些基本功能,NumPy 库还有更多高级的特性和函数可以探索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值