原文链接:blog.ouyangsihai.cn >> numpy学习2:数组创建方式
一、前言
Numerical Python,即数值Python包,是Python进行科学计算的一个基础包,所以是一个掌握其他Scipy库中模块的基础模块,一定需要先掌握该包的主要使用方式。
NumPy模块是Python的一种开源的数值计算扩展,是一个用python实现的科学计算包,主要包括:
- 一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组,称为ndarray(N-dimensional array object)
- 用于对整组数据进行快速运算的标准数学函数:ufunc(universal function object)
- 实用的线性代数、傅里叶变换和随机数生成函数。
- NumPy和稀疏矩阵的运算包Scipy配合使用更加方便。
ndarray
ndarray
- NumPy的数组类被称作ndarray。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同,后者只处理一维数组和提供少量功能。
- 一种由相同类型的元素组成的多维数组,元素数量是实现给定好的
元素的数据类型由dtype(data-type)对象来指定,每个ndarray只有一种dtype类型 - ndarray的大小固定,创建好数组后数组大小是不会再发生改变的
二、ndarray对象创建
可以通过numpy模块中的常用的几个函数进行创建ndarray多维数组对象,主要函数如下:
- array函数:接收一个普通的python序列,并将其转换为ndarray
- zeros函数:创建指定长度或者形状的全零数组。
- ones函数:创建指定长度或者形状的全1数组。
- empty函数:创建一个没有任何具体值的数组(准备地说是创建一些未初始化的ndarray多维数组)
2.1、array函数
array对象的定义:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
上面的构造器接受以下参数:
序号 | 参数及描述 |
---|---|
1. object | 任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。 |
2. dtype | 数组的所需数据类型,可选。 |
3. copy | 可选,默认为true,对象是否被复制。 |
4. order | C(按行)、F(按列)或A(任意,默认)。 |
5. subok | 默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类。 |
6. ndimin | 指定返回数组的最小维数。 |
看了这么多定义,下面看看具体的实例吧。
- 实例1
import numpy as np
#例子01
a = np.array([1,2,3,4,5])
print(a)
print(type(a))
输出:[1 2 3]
<class 'numpy.ndarray'>
- 创建多个维度
a2 = np.array([[1,2],[3,4]])
print(a2)
输出:
[[1 2]
[3 4]]
- 通过ndmin控制最小维度
#最小维度
a3 = np.array([1,2,3,4,5],ndmin = 3)
print(a3)
输出
[[[1 2 3 4 5]]]
ndmin这个参数的意思是,不管你给的数据的维度是多少,我总是会创建给出的最小的维度,比如这里ndmin=3,虽然给出的数据是一位的,但是也会创建一个三维的处理。
2.2、empty函数
- numpy.empty
创建指定形状和dtype的未初始化数组 - numpy.empty(shape, dtype = float, order = 'C')
构造器接受下列参数:
序号 | 参数及描述 |
---|---|
1. Shape | 空数组的形状,整数或整数元组 |
2. Dtype | 所需的输出数组类型,可选 |
3. Order | 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组 |
举例:
#数组元素为随机值:创建一个4*4的的矩阵,数据为随机
arr = np.empty((4,4),dtype = 'i1')
print(arr)
输出:
[[ 1 0 0 0]
[ 0 0 0 0]
[ 48 6 50 38]
[ -7 127 0 0]]
- numpy.zeros
返回特定大小,以0填充
#例
arr = np.zeros((3,3))
print(arr)
# 自定义类型
arr = np.zeros((3,3), dtype = [('x', 'i2'), ('y', 'i2')])
print(arr)
- numpy.ones
返回特定大小,以1填充
arr = np.ones((2,3,4))
print(arr)
arr = np.ones((3,3), dtype = [('x', 'i4'), ('y', 'i4')])
print(arr)
输出:
[[[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) (1, 1)]]
2.3、通过列表,元祖,元祖列表创建方式
这些主要是通过列表,元祖,元祖列表来创建的方式。
- numpy.asarray
类似 numpy.array 可以将Python序列转换为ndarray
#来自列表
arr = [1,2,3,4]
arr2 = np.asarray(arr)
print(arr2)
print(type(arr))
print(type(arr2))
输出:
[1 2 3 4]
<class 'list'>
<class 'numpy.ndarray'>
#来自元组
arr = (1,2,3,4)
arr2 = np.asarray(arr)
print(arr2)
print(type(arr))
print(type(arr2))
#来自元组列表
arr = [(1,2,3,4),(5,6,7,8)]
arr2 = np.asarray(arr)
print(arr2)
print(type(arr))
print(type(arr2))
2.4、通过Numpy 来自数值范围的数组(arange、linespace、logspace)
arange函数: 类似python的range函数,通过指定开始值、终值和步长来创建一个一维数组,注意:最终创建的数组不包含终值
linspace函数:通过指定开始值、终值和元素个数来创建一个一维数组,数组的数据元素符合等差数列,可以通过endpoint关键字指定是否包含终值,默认包含终值
logspace函数:和linspace函数类似,不过创建的是等比数列数组
使用随机数填充数组,即使用numpy.random中的random()函数来创建0-1之间的随机元素,数组包含的元素数量由参数决定numpy.arange
这个函数返回ndarray对象,包含给定范围内的等间隔值
numpy.arange(start,stop,step,dtype)
arr = np.arange(1,20,5,dtype = float)
print(arr)
输出:
[ 1. 6. 11. 16.]
- numpy.linspace
与arange函数类似 等差数列
numpy.linspace(start,stop,num,endpoint,retstep,dtype)
start | 起始值 |
---|---|
stop | 结束值 |
num | 生成等间隔样例的数量,默认为50 |
endpoint | 序列中是否包含stop 值 默认为 True |
arr = np.linspace(10,20,9)
print(arr)
arr = np.linspace(10,20,5,endpoint=False)
print(arr)
arr = np.linspace(10,20,5,retstep=True)
print(arr) #返回步长
输出:
[10. 11.25 12.5 13.75 15. 16.25 17.5 18.75 20. ]
[10. 12. 14. 16. 18.]
(array([10. , 12.5, 15. , 17.5, 20. ]), 2.5)
- numpy.logspace
等比数列
numpy.logscale(start, stop, num, endpoint, base, dtype)
1. start | 起始值是base ** start |
---|---|
2. stop | 终止值是base ** stop |
3. num | 范围内的数值数量,默认为50 |
4. endpoint | 如果为true,终止值包含在输出数组当中 |
5. base | 对数空间的底数,默认为10 |
6. dtype | 输出数组的数据类型,如果没有提供,则取决于其它参数 |
arr = np.logspace(1,10,10,base = 2)
print(arr)
输出:
[ 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024.]
2.5、random创建方式
- rand 返回 0 - 1 随机值
- randn 返回一个样本具有标准正态分布
- randint 返回随机的整数,位于半开区间[low,hight)size = 10 (3,3)
- random_integers(low[, high, size]) 返回随机的整数,位于闭区间
- random 返回随机浮点数
arr = np.random.rand(9).reshape(3,3)
print(arr)
arr = np.random.rand(3,2,3)
print(arr)
arr = np.random.randn(9).reshape(3,3)
print(arr)
arr = np.random.randn(3,2,3)
print(arr)
arr = np.random.randint(1,9,size = (2,4))
print(arr)
arr = np.random.random_integers(1,9,size =(2,4))
print(arr)
arr = np.random.random((3,2,3))
print(arr)
arr = np.random.randn(3,2,3)
print(arr)
cplus人工智能算法后端技术