numpy学习

NumPy(Numeric Python)

多维数组对象和用于处理数组的例程集合组成的库

dtype(数据类型对象)

描述了对应于数组的固定内存块的解释,取决于以下几个方面:

数据类型(整数、浮点或者python对象)

数据大小

字节序(大端或小端)

在结构化类型的情况下,字段的名称每个字段的数据类型,和每个字段占用的内存块部分。

如果数据类型是子序列,它的形状和数据类型。

import numpy as np
dt=np.dtype(np.int32)
print(dt)
​
dt=np.dtype('i4')
print(dt)
​
dt=np.dtype('>i4')
print(dt)
​
 

数组属性

axis=0表示沿着第0轴进行操作,即对每一列进行操作;

axis=1表示沿着第1轴进行操作,即对每一行进行操作;

属性说明
ndarray.ndim秩,即轴的数量或维度的数量
ndarray.shape数组的维度,对于矩阵,n 行 m 列
ndarray.size数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtypendarray 对象的元素类型
ndarray.itemsizendarray 对象中每个元素的大小,以字节为单位
ndarray.flagsndarray 对象的内存信息
ndarray.realndarray元素的实部
ndarray.imagndarray 元素的虚部
ndarray.data包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

创建数组

numpy.zeros(shape,dtype=float,order='C')

参数说明:数组形状,数组类型,可选,‘C'用于C的行数组,或者’F‘用于FORTRAN

ndarray

一种多维数组对象,是一个通用的同构数据多维容器,其中所有的元素必须是相同类型的

import numpy as np
#1.创建数组
#使用array函数,接受一切序列型对象(包括其他数组),然后产生一个新的含有传入数据的numpy数组
data=[1,1,2,3]
print(np.array(data))#[1 1 2 3]
​
#嵌套序列,转化成多维数组
data2=[[1,1,1,1],[2,2,2,2]]
arr2=np.array(data2)
print(arr2)
#[[1 1 1 1]
 # [2 2 2 2]]
print(arr2.ndim)#2
print(arr2.shape)#(2, 4)
#创建全0,全1数组
print(np.zeros(10))
print(np.ones((3,5)))
print(np.empty((2,3,4)))
​
#2.数据类型
arr=np.array([1,2,3])
print(arr.dtype)#int32
float_array=arr.astype(np.float64)
print(float_array.dtype)#float64

numpy数组的运算

特点:矢量化(大小相等的数组之间的任何算术运算都会应用到元素级)、广播(数组与标量的算是运算会传播到各个元素)

arr1=np.array([[1,2,3],[4,5,6]])
arr2=np.array([[2,3,4],[5,6,7]])
print(arr1+arr2)
# [[ 3  5  7]
 # [ 9 11 13]]
print(1/arr1)
# [[1.         0.5        0.33333333]
 # [0.25       0.2        0.16666667]]
# 大小相同的数组之间的比较生成布尔值数组
print(arr2>arr1)
# [[ True  True  True]
 # [ True  True  True]]

基本的切片和索引

将标量赋值给数组的切片也会广播

数组的切片是原始数组的视图,即数据不会被复制,视图上的任何修改都会直接反映到原数组上

arr3=np.arange(10)
print(arr3)#[0 1 2 3 4 5 6 7 8 9]
arr3[5:8]=10
print(arr3)#[ 0  1  2  3  4 10 10 10  8  9]
arr4=arr3[5:8]
arr4[:]=5
print(arr3)#[0 1 2 3 4 5 5 5 8 9]
arr4[1]=12345
print(arr3)#[    0     1     2     3     4     5 12345     5     8     9]
print(arr4)#[    5 12345     5]

如果想要得到ndarray切片的副本而非视图就需要明确地进行复制操作,例如arr[5:8].copy()

高维度数组的访问

#高维度数组的访问
arr5=np.array([[[1,2,3],[4,4,5]],[[3,3,6],[2,2,4]]])
print(arr5[0])
#[[1 2 3]
 # [4 4 5]]
arr5[1]=2
print(arr5)
# [[[1 2 3]
#   [4 4 5]]
# 
#  [[2 2 2]
#   [2 2 2]]]

切片索引

arr6=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr6[:2])#前两行,第0轴切片
# [[1 2 3]
#  [4 5 6]]
print(arr6[:2,1:])#前两行,第1列往后所有
# [[2 3]
#  [5 6]]
print(arr6[:,:1])#所有行,第0列
# [[1]
#  [4]
 # [7]]
arr6[:2,1:]=0
print(arr6)
# [[1 0 0]
#  [4 0 0]
#  [7 8 9]]

布尔型索引

names=np.array(['Amy','Cherry','Amy','Cindy','Cherry'])
data=np.random.randn(5,4)
print(data)
# [[-0.42072297  0.3761964   0.1811894   1.15924724]
#  [-2.06446226 -0.4948006  -0.1654302   0.6866528 ]
#  [ 1.62876039 -1.17275557 -1.28842686  1.34402062]
#  [ 0.37676664  0.49161573 -0.37323651  0.92192948]
#  [ 0.51845432 -0.03713897 -1.54457863  0.40845419]]
#假设每个名字对应data数组中的一行
choice=names=='Amy'
print(choice)#布尔型数组用于索引
# [ True False  True False False]
#注意:布尔型数组的长度必须跟被索引的轴长度一致data和索引数组长度一致
print(data[choice])
# [[-0.42072297  0.3761964   0.1811894   1.15924724]
#  [ 1.62876039 -1.17275557 -1.28842686  1.34402062]]
print(data[choice,2:])
# [[ 0.1811894   1.15924724]
#  [-1.28842686  1.34402062]]
#将data中所有负值设置为0
data[data<0]=0
print(data)
# [[0.         0.3761964  0.1811894  1.15924724]
#  [0.         0.         0.         0.6866528 ]
#  [1.62876039 0.         0.         1.34402062]
#  [0.37676664 0.49161573 0.         0.92192948]
#  [0.51845432 0.         0.         0.40845419]]

花式索引

特定顺序选取子集,传入指定顺序的整数列表或ndarray

arr=np.empty((8,4))
for i in range(8):
    arr[i]=i
print(arr[[4,0,1,2]])
# [[4. 4. 4. 4.]
#  [0. 0. 0. 0.]
#  [1. 1. 1. 1.]
#  [2. 2. 2. 2.]]
print(arr[[-4,-2]])
# [[4. 4. 4. 4.]
#  [6. 6. 6. 6.]]
#一次缠绕多个索引数组会有一点特别,返回的是一个一维数组,其中的元素对应各个索引元组
arr=np.arange(32).reshape((8,4))
print(arr[[1,5,7,2],[0,3,1,2]])
# [ 4 23 29 10]
print(arr[[1,5,7,2]][:,[0,3,1,2]])
# [[ 4  7  5  6]
#  [20 23 21 22]
#  [28 31 29 30]
#  [ 8 11  9 10]]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值