深度学习基础(一) -- Numpy详解

前言

Numpy是一个很强大的python矩阵计算的一个库,通过Numpy,可以进行如下的一些操作:1)数组的算数和逻辑运算、2)傅里叶变换和用于图形操作的例程、3)与线性代数有关的操作,Numpy拥有线性代数和随机数生成的内置函数。

注,现在一般通过Numpy、Scipy(Scientific Python)和Matplotlib(绘图库)结合来替代MatLab

ndarray对象

numpy中定义的最重要的对象是称为ndarray的N维数组类型,它描述相同类型的元素集合。

构造方法

基本的ndarray是使用NumPy中的数组函数创建

numpy.array
(
	object, 
	dtype = None, 
	copy = True, 
	order = None, 
	subok = False, 
	ndmin = 0
)

相关参数说明:
object - 任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。
dtype - 数组的所需数据类型,可选。
copy - 默认为true,对象是否被复制,可选。
order - C(按行)、F(按列)或A(任意,默认)。
subok - 默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类。
ndmin - 指定返回数组的最小维数。

下面看一些简单的例子:

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

# out:
# [[1 2 3]
#  [4 5 6]]
# dtype为复数
import numpy as np 
array = np.array([1,2,3],dtype=complex)
print(array)

# out:
# [1.+0.j 2.+0.j 3.+0.j]
数组属性

ndarray.shape:这一数组属性返回一个包含数组维度的元组,另外,它也可以用于调整数组的大小。

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

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

# out:
# [[1 2]
#  [3 4]
#  [5 6]]
# 可以通过reshape函数调整大小
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print(b)

ndarray.ndim:这一数组属性返回数组的维数

# 一维数组
import numpy as np
a = np.arange(24)
print(a.ndim) #out: 1
# 现在调整其大小
b = a.reshape(6,2,2)
print(b.ndim) #out: 3
# b现在拥有三个维度

ndarray.itemsize: 这一数组属性返回数组中每个元素的字节单位长度

# 数组的dtype为float32(四个字节)
import numpy as np
x = np.array([1,2,3,4,5], dtype = numpy.float32)
print(x.itemsize)

#out  4

数组类型对象dtype

数据类型对象dtype描述了对应于数组固定内存块的解释,包括以下几个方面:
    1、数据类型(整数、浮点或者Python对象)。
    2、数据大小。
    3、字节序(小端或大端)。
    4、在结构化类型的情况下,字段的名称,每个字段的数据类型,和每个字段占用的内存块部分。
    5、如果数据类型是子序列,它的形状和数据类型。

字节顺序取决于数据类型的前缀<或>。 <意味着编码是小端(最小有效字节存储在最小地址中),>意味着编码是大端(最大有效字节存储在最小地址中)。

numpy.dtype
(
	object, 
	align, 
	copy
)

相关参数说明如下:
   object:被转换为数据类型的对象。
   align:如果为true,则向字段添加间隔,使其类似C的结构体。
   copy:生成dtype对象的新副本,如果为false,结果是内建数据类型对象的引用。

# 使用数组标量类型
import numpy as np
dt = np.dtype(numpy.int32)
print(dt)

# int32
# int8,int16,int32,int64可替换为等价的字符串'i1','i2','i4','i8'
import numpy as np
dt = np.dtype('i8')
print(dt)
# int64
import numpy as np
dt = np.dtype([('age',numpy.int8)]) # 创建结构化数据类型
print(dt) 
# [('age', 'i1')]
a = numpy.array([(10,),(20,),(30,)], dtype = dt) # 现在将其应用于ndarray对象
print(a)
# [(10,) (20,) (30,)]
print(a['age'])
# [10 20 30]
import numpy as np
# 定义名为student的结构化数据类型,其中包含字符串字段name,整数字段age和浮点字段marks。 
# 并将此dtype应用于ndarray对象。
student = np.dtype([('name', 'S20'), ('age', 'i1'), ('marks', 'f4')])
a = numpy.array([('abc', 21, 50), ('xyz', 18, 75)], dtype=student)
print(a)
# [('abc', 21, 50.) ('xyz', 18, 75.)]
print(a['name'])
# ['abc' 'xyz']
print(a['age'])
# [21 18]
print(a['marks'])
# [50. 75.]

用Numpy操作数组

创建数组

1.numpy.empty:它创建指定形状和dtype的未初始化数组。

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

相关参数说明如下:
    shape:空数组的形状,整数或整数元组。
    dtype:所需的输出数组类型,可选。
    order:'C’为按行的C风格数组,'F’为按列的Fortran风格数组。

import numpy
x = numpy.empty([3,2], dtype = int)
print(x)
# [[-1659479952       32766]
#  [-1659475360       32766]
#  [          0           0]]

其中,数组元素为随机值,因为它们未初始化。

2.numpy.zeros:返回特定大小,以0填充的新数组。

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

相关参数说明同上

# 含有5个0的数组,默认类型为float  
import numpy as np
x = np.zeros(5) 
# 或x = np.zeros((1, 5)) 
print(x)
# [0. 0. 0. 0. 0.]
import numpy as np
x = np.zeros((5,), dtype = numpy.int)
print(x)
# [0 0 0 0 0]
# 自定义类型
import numpy as np
x = np.zeros((2,2), dtype =  [('x',  'i1'),  ('y',  'i1')])
print(x)
# [[(0, 0) (0, 0)]
#  [(0, 0) (0, 0)]]

3.numpy.ones:返回特定大小,以1填充的新数组。

numpy.ones
(
	shape, 
	dtype = None, 
	order = 'C'
)

相关参数说明同上。

import numpy as np
x = np.ones([2,2], dtype = int)
print(x)
# [[1 1]
#  [1 1]]

4.numpy.asarray:此函数类似于numpy.array,这个例程对于将Python序列转换为ndarray非常有用。

numpy.asarray
(
	a, 
	dtype = None, 
	order = None
)

相关参数说明如下:
   a:任意形式的输入参数,比如列表、列表的元组、元组、元组的元组、元组的列表。
   dtype:通常,输入数据的类型会应用到返回的ndarray。
   order:'C’为按行的C风格数组,'F’为按列的Fortran风格数组。

# 将列表转换为ndarray
import numpy as np
x = [1, 2, 3]
a = np.asarray(x)
print(a)
# [1 2 3]
import numpy as np
x = [1, 2, 3]
a = np.asarray(x,dtype=float)
print(a)
# [1. 2. 3.]
# 来自元组列表的 ndarray
import numpy as np
x = [(1, 2, 3), (4, 5)]
a = np.asarray(x)
print(a)
# [(1, 2, 3) (4, 5)]

5,numpy.arange:这个函数返回ndarray对象,包含给定范围内的等间隔值。

numpy.arange
(
	start, 
	stop, 
	step, 
	dtype
)

相关参数说明如下:
   start:范围的起始值,默认为0.
   stop:范围的终止值(不包含)。
   step:两个值的间隔,默认为1。
   dtype:返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。

import numpy as np
# 设置了 dtype
x = np.arange(5, dtype =  float)  
print x
# [0. 1. 2. 3. 4.]
# 设置了起始值和终止值参数  
import numpy as np
x = np.arange(10,20,2)  
print(X)
# [10  12  14  16  18]

数组的索引和切片

一维数组的索引和切片:


import numpy as np
arr = np.arange(10)
print(arr)
# [0 1 2 3 4 5 6 7 8 9]
print(arr[1:8])
# [1 2 3 4 5 6 7]
print(arr[:8:3])
# [0 3 6]
print(arr[::-1])
# [9 8 7 6 5 4 3 2 1 0]

多维数组的索引和切片:

import numpy as np
arr = np.arange(16).reshape(2,4,2)
print(arr)
# [[[ 0  1]
#   [ 2  3]
#   [ 4  5]
#   [ 6  7]]
#
#  [[ 8  9]
#   [10 11]
#   [12 13]
#   [14 15]]]
print(arr[0,0,0])
# 0
print(arr[1,3,1])
# 15
print(arr[:,0,0])
# [0 8]
print(arr[0])
#[[0 1]
# [2 3]
# [4 5]
# [6 7]]
print(arr[0,:,:]) # 效果同上
print(arr[0,...]) # 效果同上
print(arr[0, :, 1])
# [1 3 5 7]
print(arr[0, :, -1])
# [1 3 5 7]
print(arr[0, ::-1, -1])
# [7 5 3 1]
print(arr[0, ::2, -1])
# [1 5]
print(arr[::-1])
#[[[ 8  9]
#  [10 11]
#  [12 13]
#  [14 15]]
#
# [[ 0  1]
#  [ 2  3]
#  [ 4  5]
#  [ 6  7]]]

花式索引:

import numpy as np
arr = np.empty((5, 3))
for i in range(5):
    arr[i] = i
print(arr)
# [[0. 0. 0.]
#  [1. 1. 1.]
#  [2. 2. 2.]
#  [3. 3. 3.]
#  [4. 4. 4.]]
print(arr[[3,1,2,0]]) #以第3,1,2,0行的顺序选取子集,从0开始计数
# [[3. 3. 3.]
#  [1. 1. 1.]
#  [2. 2. 2.]
#  [0. 0. 0.]]
print(arr[[-2,-3,-1]]) #以倒数第2,3,1行顺序选取子集,负数是从-1开始计数
# [[3. 3. 3.]
#  [2. 2. 2.]
#  [4. 4. 4.]]

数组运算

import numpy as np
arr1 = np.array([[2,1],[1,2]])
arr2 = np.array([[1,2],[3,4]])
print(arr1 - arr2) # 减法运算
# [[ 1 -1]
#  [-2 -2]]
 
print(arr1**2) # 乘方运算
# [[4 1]
#  [1 4]]
 
print(3*arr2) # 数乘运算
# [[ 3  6]
#  [ 9 12]]
 
print(arr1*arr2)  # 普通乘法(对应位相乘)
# [[2 2]
#  [3 8]]
 
print(numpy.dot(arr1,arr2))  # 矩阵乘法
# [[ 5  8]
#  [ 7 10]]
 
print(arr2.T)  #矩阵转置
# [[1 3]
#  [2 4]]
 
print(numpy.linalg.inv(arr2)) # 返回逆矩阵
# [[-2.   1. ]
#  [ 1.5 -0.5]]
 
print(arr2.sum())  # 数组元素求和
# 10
print(arr2.max())  # 返回数组最大元素
# 4
 
# 如果是一维数组,就是当前列之前的和加到当前列上
# 如果是二维数组,axis可以是0(第一行不动,其他行累加), 可以是1(第一列列不动,其他列累加)
print(arr2.cumsum(axis = 1))
# [[1 3]
#  [3 7]]
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值