本章节主要介绍的是python的一个常用库numpy,通过本章教程希望能够掌握numpy库一些常用的方法。
NumPy 是一个 Python 的第三方库,代表 “Numeric Python”,主要用于数学/科学计算。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。
使用 Numpy 我们可以轻松进行如下等计算:
推荐使用pip命令进行安装或者下载 Anaconda (一个python集成环境应用,内置numpy等常用库)
pip install numpy
我们可以引入numpy,如果未报错说明已经正常安装
import numpy as np
这里介绍一个概念:NumPy - Ndarray 对象,Ndarray对象是numpy里面最重要的一个 N维数组 对象。
调用numpy.array方法可以从任何暴露数组接口的对象,或从返回数组的任何方法创建一个ndarray类型的对象。
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数 | 描述 |
---|---|
object | 任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。 |
dtype | 数组的所需数据类型,可选。 |
copy | 可选,默认为true,对象是否被复制。 |
order | C(按行)、F(按列)或A(任意,默认)。 |
subok | 默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类。 |
ndimin | 指定返回数组的最小维数。 |
我们先看几个简单的栗子帮助我们理解:
import numpy as np
list = [1,2,3,4]
oneArray = np.array(list)
print(list) #[1, 2, 3, 4] 这是python的列表对象
print(oneArray) #[1 2 3 4] 这是一个一维数组
import numpy as np
twoArray = np.array([[1,2],[3,4],[5,6]])
print(twoArray) #[[1 2] [3 4] [5 6]] 这是一个二维数组
了解了一些概念之后我们看一下numpy的数据类型:
类型 | 描述 |
---|---|
bool | 存储为一个字节的布尔值(True或False)。 |
int | 默认整数,通常为int32或int64。 |
int8 | 字节(-128 ~ 127)。 |
int16 | 整数(-32768 ~ 32767)。 |
int32 | 整数(-2 * 31 ~ 2 * 31 - 1)。 |
int64 | 整数(-2 * 63 ~ 2 * 63 - 1)。 |
uint8 | 无符号整数(0 ~ 255)。 |
uint16 | 无符号整数(0 ~ 65535)。 |
uint32 | 无符号整数(0 ~ 2 ** 32 - 1)。 |
uint64 | 无符号整数(0 ~ 2 ** 64 - 1)。 |
float16 | 半精度浮点,符号位,5 位指数,10 位尾数。 |
float32 | 单精度浮点,符号位,8 位指数,23 位尾数。 |
float64或float | 双精度浮点,符号位,11 位指数,52 位尾数。 |
complex64 | 复数,由两个 32 位浮点表示(实部和虚部)。 |
complex128或complex | 复数,由两个 64 位浮点表示(实部和虚部)。 |
NumPy 数字类型是dtype(数据类型)对象的实例,每个对象具有唯一的特征。
数据类型对象描述了对应于数组的固定内存块的解释,取决于以下方面:
numpy.dtype(object, align, copy)
参数 | 描述 |
---|---|
Object | 存储为一个字节的布尔值(True或False)。 |
Align | 如果为true,则向字段添加间隔,使其类似 C 的结构体。 |
Copy | 生成dtype对象的新副本,如果为flase,结果是内建数据类型对象的引用。 |
示例:
import numpy as np
#int 32
dt = np.dtype(np.int32)
print(dt)
#int8,int16,int32,int64 可替换为等价的字符串 'i1','i2','i4',以及其他。
dt4 = np.dtype('i4')
print(dt4) # int32
dt8 = np.dtype('i8')
print(dt8) # int64
# 使用端记号
dt11 = np.dtype('>i4')
print dt11 # >i4
# 创建结构化数据类型。
dts = np.dtype([('age',np.int8)])
print dts # [('age', 'i1')]
# 以下示例定义名为 student 的结构化数据类型,其中包含字符串字段name,整数字段age和浮点字段marks。 此dtype应用于ndarray对象
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
print student
#[('name', 'S20'), ('age', 'i1'), ('marks', '
在了解了dtype数组的构造方法后,我们来了解dtype的数组属性。
方法 | 描述 |
---|---|
ndarray.shape | 返回一个包含数组维度的元组,它也可以用于调整数组大小 |
ndarray.reshape | 用来调整数组大小 |
ndarray.ndim | 返回数组的维数。 |
numpy.itemsize | 返回数组中每个元素的字节单位长度。 |
# ndarray.shape 返回一个包含数组维度的元组,它也可以用于调整数组大小
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print a.shape #(2,3) 表示这是一个二行三列的数组
----------
#改变数组的大小
b = a
b.shape = (3,2)
print(b) # b成为了一个三行两列的新数组
# [
# [1 2]
# [3 4]
# [5 6]
# ]
----------
# 直接使用reshape方法进行转化
c = a.reshape(3,2)
print(c)
# [
# [1 2]
# [3 4]
# [5 6]
# ]
----------
# ndarray.ndim 返回数组的维数
d = np.array([1,2,3,4,5])
e = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(d.ndim) # 1
print(e.ndim) # 2
----------
# numpy.itemsize
f = np.array([1,2,3,4,5], dtype = np.int8)
print(f.itemsize) # 1 np.int8(一个字节)
g = np.array([1,2,3,4,5], dtype = np.float32)
print(g.itemsize) # 4 np.float32(四个字节)
使用numpy创建数组有多种形式,我们一一来了解一下
这三种方法有相同的参数列表:
参数 | 描述 |
---|---|
shape | 空数组的形状,整数或整数元组 |
dtype | 所需的输出数组类型,可选 |
order | ‘C’为按行的 C 风格数组,’F’为按列的 Fortran 风格数组 |
以下是这三种方法的Demo:
import numpy as np
# 使用 numpy.empty
x = np.empty([2,2], dtype = int)
print(x)
#由于我们未给定初始化值,所以初始化出来的值是随机int8类型
# [
# [ 1152921504606846976 -8070441754919082034]
# [ 4333764610 562954288073672]
# ]
----------
# 使用 numpy.zeros
y = np.zeros([4], dtype = int)
print(y)
#我们使用zeros方法创建了4个0元素
# [0 0 0 0]
----------
# 使用 numpy.ones
z = np.ones([3], dtype = int)
print(z)
#我们使用ones方法创建了3个1元素
# [1 1 1]
numpy.asarray(a, dtype = None, order = None)
参数 | 描述 |
---|---|
a | 任意形式的输入参数,比如列表、列表的元组、元组、元组的元组、元组的列表 |
dtype | 输入出的数组类型,可选 |
order | ‘C’为按行的 C 风格数组,’F’为按列的 Fortran 风格数组 |
import numpy as np
x = [1,2,3] # x是python的列表类型 不是数组
a = np.asarray(x)
print(a) # [1 2 3]
y = (4,5,6) # y是python的元组类型
b = np.asarray(y, dtype = float, order = 'F')
print(b) # [4. 5. 6.]
numpy.fromiter(iterable, dtype, count = -1)
参数 | 描述 |
---|---|
iterable | 任何可迭代对象 |
dtype | 返回数组的数据类型 |
count | 需要读取的数据数量,默认为-1,读取所有数据 |
import numpy as np
x = range(5) # range方法创建了一个列表
a = np.fromiter(x)
print(a) #[0. 1. 2. 3. 4.]
在某些特定的情况下我们可能需要创建某些数值数组,这时我们可以使用numpy.arange方法。
numpy.arange(start, stop, step, dtype)
参数 | 描述 |
---|---|
start | 范围的起始值,默认为0 |
stop | 范围的终止值(不包含) |
step | 两个值的间隔,默认为1 |
dtype | 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。 |
import numpy as np
#从2开始,到15结束,不包含15,步长为2创建一个数组
x = np.arange(2,15,2, dtype = int)
print(x) # [ 2 4 6 8 10 12 14]
这个方法常用于类似绘制直方图的时候,我们需要进行组数的分组,然后每隔一个组间距来绘制,类似这种情况用此方法来生成数组最佳。
numpy.linspace(start, stop, num, endpoint, retstep, dtype)
参数 | 描述 |
---|---|
start | 范围的起始值 |
stop | 序列的终止值,如果endpoint为true,该值包含于序列中 |
num | 要生成的等间隔样例数量,默认为50 |
endpoint | 序列中是否包含stop值,默认为ture |
retstep | 如果为true,返回样例,以及连续数字之间的步长 |
dtype | 输出ndarray的数据类型 |
import numpy as np
# 假设统计 2000到10000工资的人群所占的比例,分组为21
group = 21
start = 2000
stop = 10000
x = np.linspace(start,stop,group, retstep=True,dtype = int)
print(x)
#(array([ 2000, 2400, 2800, 3200, 3600, 4000, 4400, 4800, 5200,
5600, 6000, 6400, 6800, 7200, 7600, 8000, 8400, 8800,
9200, 9600, 10000]), 400.0)
我们先来看一下python中的切片和索引
#创建一个列表
pyList = []
for item in range(1,11):
pyList.append(item)
print(pyList)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
x = pyList[2]
print(x)
# 3 下标从0开始
y = pyList[:5]
print(y)
# [1, 2, 3, 4, 5] 从索引0开始取,直到索引5为止,但不包括索引5
z = pyList[-2:]
print(z)
# [9, 10] 从倒数第一个数开始取,直到索引-2为止,倒数第一个数索引为-1
我们再来看看 numpy中的索引和切片
import numpy as np
#slice(start,stop, step)
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
s = slice(2,7,2) # 从数组索引为 2开始,到7结束,步长为2 ——> 2 4 6
print a[s] # [2 4 6]
s2 = slice(3,8,1) # stop不会包含在内
print(a[s2])# [3 4 5 6 7]
# 我们可以直接将切片数据通过冒号的间隔方式直接传递
b = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
print(b[2:7:2]) # [2 4 6]
# 如果只输入一个参数,则将返回与索引对应的单个项目
c = b[3]
print(c) # 3
# 如果使用a:,则从该索引向后的所有项目将被提取。
d = b[3:]
print(d) # [3 4 5 6 7 8 9]
# 如果使用两个参数(以:分隔),则对两个索引(不包括停止索引)之间的元素以默认步骤进行切片。
e = b[3:7]
print(e) # [3 4 5 6]
# 如果只传冒号 类似与python的拷贝
f = b[:]
print(f) # [0 1 2 3 4 5 6 7 8 9]
NumPy 广播 指的是在算术运算期间处理不同形状的数组的能力。
譬如我们将一个一维数组与一维数组相加肯定是可以操作的,那么我们如果将一个一维数组与一个二维数组相加呢?本身这种操作是不可行的但是使用numpy我们就可以进行这种操作。
我们看下下面的这个栗子:
import numpy as np
a = np.array([[0.0,0.0,0.0],[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]])
b = np.array([1.0,2.0,3.0])
print('第一个数组:')
print(a)
print('\n' )
print('第二个数组:')
print(b)
print('\n')
print('第一个数组加第二个数组:')
print(a + b)
# 第一个数组:
[[ 0. 0. 0.]
[10. 10. 10.]
[20. 20. 20.]
[30. 30. 30.]]
# 第二个数组:
[1. 2. 3.]
# 第一个数组加第二个数组:
[[ 1. 2. 3.]
[11. 12. 13.]
[21. 22. 23.]
[31. 32. 33.]]
第二个数组维度小于第一个,使用加法相加的时候,第二数数组会扩展成为
[[1. 2. 3.]
[1. 2. 3.]
[1. 2. 3.]
[1. 2. 3.]]
方法 | 描述 |
---|---|
flat | 数组上的一维迭代器 |
flatten | 返回折叠为一维的数组副本 |
ravel | 返回连续的展开数组 |
transpose | 翻转数组的维度 |
ndarray.T | 和self.transpose()相同 |
rollaxis | 向后滚动指定的轴 |
swapaxes | 互换数组的两个轴 |
import numpy as np
a = np.arange(8).reshape(2,4)
print('原始数组:')
print(a)
print('\n')
print('调用 flat 函数之后:')
# 返回展开数组中的下标的对应元素
print(a.flat[5])
# 原始数组:
[[0 1 2 3]
[4 5 6 7]]
# 调用 flat 函数之后:
5
ndarray.flatten(order)
# order:
# 'C' — 按行,
# 'F' — 按列,
# 'A' — 原顺序,
# 'k' — 元素在内存中的出现顺序。
import numpy as np
a = np.arange(8).reshape(2,4)
print('原数组:')
print(a)
print('\n')
# default is column-major
print('展开的数组:')
print(a.flatten())
print('\n')
print('以 F 风格顺序展开的数组:')
print(a.flatten(order = 'F'))
# 原数组:
[[0 1 2 3]
[4 5 6 7]]
# 展开的数组:
[0 1 2 3 4 5 6 7]
# 以 F 风格顺序展开的数组:
[0 4 1 5 2 6 3 7]
numpy.ravel(a, order)
# order:
# 'C' — 按行,
# 'F' — 按列,
# 'A' — 原顺序,
# 'k' — 元素在内存中的出现顺序。
import numpy as np
a = np.arange(8).reshape(2,4)
print('原数组:')
print(a)
print('\n')
print('调用 ravel 函数之后:')
print(a.ravel())
print('\n')
print('以 F 风格顺序调用 ravel 函数之后:')
print(a.ravel(order = 'F'))
# 原数组:
[[0 1 2 3]
[4 5 6 7]]
# 调用 ravel 函数之后:
[0 1 2 3 4 5 6 7]
# 以 F 风格顺序调用 ravel 函数之后:
[0 4 1 5 2 6 3 7]
numpy.transpose(arr, axes)
# arr:要转置的数组
# axes:整数的列表,对应维度,通常所有维度都会翻转。
import numpy as np
a = np.arange(12).reshape(3,4)
print('原数组:')
print(a)
print('\n')
print('转置数组:')
print(np.transpose(a)) #等同于 a.T
# 原数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
# 转置数组:
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
numpy.rollaxis(arr, axis, start)
# arr:输入数组
# axis:要向后滚动的轴,其它轴的相对位置不会改变
# start:默认为零,表示完整的滚动。会滚动到特定位置。
# 创建了三维的 ndarray
import numpy as np
a = np.arange(8).reshape(2,2,2)
print('原数组:')
print(a)
print('\n')
# 将轴 2 滚动到轴 0(宽度到深度)
print('调用 rollaxis 函数:')
print(np.rollaxis(a,2))
# 将轴 0 滚动到轴 1:(宽度到高度)
print('\n')
print('调用 rollaxis 函数:')
print(np.rollaxis(a,2,1))
# 原数组:
[[
[0 1]
[2 3]
]
[
[4 5]
[6 7]
]
]
# 调用 rollaxis 函数:
[[[0 2]
[4 6]]
[[1 3]
[5 7]]]
# 调用 rollaxis 函数:
[[[0 2]
[1 3]]
[[4 6]
[5 7]]]
numpy.swapaxes(arr, axis1, axis2)
# arr:要交换其轴的输入数组
# axis1:对应第一个轴的整数
# axis2:对应第二个轴的整数
# 创建了三维的 ndarray
import numpy as np
a = np.arange(8).reshape(2,2,2)
print('原数组:')
print(a)
print('\n')
# 现在交换轴 0(深度方向)到轴 2(宽度方向)
print('调用 swapaxes 函数后的数组:')
print(np.swapaxes(a, 2, 0))
# 原数组:
[[[0 1]
[2 3]]
[[4 5]
[6 7]]]
# 调用 swapaxes 函数后的数组:
[[[0 4]
[2 6]]
[[1 5]
[3 7]]]
常用修改维度:
方法 | 描述 |
---|---|
broadcast | 产生模仿广播的对象 |
broadcast_to | 将数组广播到新形状 |
expand_dims | 扩展数组的形状 |
squeeze | 从数组的形状中删除单维条目 |
import numpy as np
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6])
# 对 y 广播 x
b = np.broadcast(x,y)
# 它拥有 iterator 属性,基于自身组件的迭代器元组
print('对 y 广播 x:')
r,c = b.iters
print(r.next(), c.next() )
print(r.next(), c.next() )
print('\n')
# shape 属性返回广播对象的形状
print('广播对象的形状:')
print(b.shape)
print('\n')
# 手动使用 broadcast 将 x 与 y 相加
b = np.broadcast(x,y)
c = np.empty(b.shape)
print('手动使用 broadcast 将 x 与 y 相加:')
print(c.shape)
print('\n')
c.flat = [u + v for (u,v) in b]
print('调用 flat 函数:')
print(c)
print('\n')
# 获得了和 NumPy 内建的广播支持相同的结果
print('x 与 y 的和:')
print(x + y)
# 对 y 广播 x:
1 4
1 5
# 广播对象的形状:
(3, 3)
# 手动使用 broadcast 将 x 与 y 相加:
(3, 3)
# 调用 flat 函数:
[[ 5. 6. 7.]
[ 6. 7. 8.]
[ 7. 8. 9.]]
# x 与 y 的和:
[[5 6 7]
[6 7 8]
[7 8 9]]
numpy.broadcast_to(array, shape, subok)
import numpy as np
a = np.arange(4).reshape(1,4)
print('原数组:')
print(a)
print('\n')
print('调用 broadcast_to 函数之后:')
print(np.broadcast_to(a,(4,4)))
# 原数组:
[[0 1 2 3]]
# 调用 broadcast_to 函数之后:
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
numpy.expand_dims(arr, axis)
# arr:输入数组
# axis:新轴插入的位置
import numpy as np
x = np.array(([1,2],[3,4]))
print('数组 x:')
print(x)
print('\n')
y = np.expand_dims(x, axis = 0)
print('数组 y:')
print(y)
print('\n')
print('数组 x 和 y 的形状:')
print(x.shape, y.shape)
print('\n')
# 在位置 1 插入轴
y = np.expand_dims(x, axis = 1)
print('在位置 1 插入轴之后的数组 y:')
print( y)
print('\n')
print('x.ndim 和 y.ndim:')
print(x.ndim,y.ndim)
print('\n')
print('x.shape 和 y.shape:')
print(x.shape, y.shape)
# 数组 x:
[[1 2]
[3 4]]
# 数组 y:
[[[1 2]
[3 4]]]
# 数组 x 和 y 的形状:
(2, 2) (1, 2, 2)
# 在位置 1 插入轴之后的数组 y:
[[[1 2]]
[[3 4]]]
# x.ndim 和 y.ndim:
2 3
# x.shape 和 y.shape:
(2, 2) (2, 1, 2)
numpy.squeeze(arr, axis)
# arr:输入数组
# axis:整数或整数元组,用于选择形状中单一维度条目的子集
import numpy as np
x = np.arange(9).reshape(1,3,3)
print('数组 x:')
print(x)
print('\n')
y = np.squeeze(x)
print('数组 y:')
print(y)
print('\n')
print('数组 x 和 y 的形状:')
print(x.shape, y.shape)
# 数组 x:
[[[0 1 2]
[3 4 5]
[6 7 8]]]
# 数组 y:
[[0 1 2]
[3 4 5]
[6 7 8]]
# 数组 x 和 y 的形状:
(1, 3, 3) (3, 3)
方法 | 描述 |
---|---|
concatenate | 沿着现存的轴连接数据序列 |
stack | 沿着新轴连接数组序列 |
hstack | 水平堆叠序列中的数组(列方向) |
vstack | 竖直堆叠序列中的数组(行方向) |
numpy.concatenate((a1, a2, ...), axis)
# a1, a2, ...:相同类型的数组序列
# axis:沿着它连接数组的轴,默认为 0
import numpy as np
a = np.array([[1,2],[3,4]])
print('第一个数组:')
print(a)
print('\n')
b = np.array([[5,6],[7,8]])
print('第二个数组:')
print(b)
print('\n')
# 两个数组的维度相同
print('沿轴 0 连接两个数组:')
print(np.concatenate((a,b)))
print('\n')
print('沿轴 1 连接两个数组:')
print(np.concatenate((a,b),axis = 1))
# 第一个数组:
[[1 2]
[3 4]]
# 第二个数组:
[[5 6]
[7 8]]
# 沿轴 0 连接两个数组:
[[1 2]
[3 4]
[5 6]
[7 8]]
# 沿轴 1 连接两个数组:
[[1 2 5 6]
[3 4 7 8]]
numpy.stack(arrays, axis)
# arrays:相同形状的数组序列
# axis:返回数组中的轴,输入数组沿着它来堆叠
import numpy as np
a = np.array([[1,2],[3,4]])
print('第一个数组:')
print(a)
print('\n')
b = np.array([[5,6],[7,8]])
print('第二个数组:')
print(b)
print('\n')
print('沿轴 0 堆叠两个数组:')
print(np.stack((a,b),0))
print('\n')
print('沿轴 1 堆叠两个数组:')
print(np.stack((a,b),1))
# 第一个数组:
[[1 2]
[3 4]]
# 第二个数组:
[[5 6]
[7 8]]
# 沿轴 0 堆叠两个数组:
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
# 沿轴 1 堆叠两个数组:
[[[1 2]
[5 6]]
[[3 4]
[7 8]]]
import numpy as np
a = np.array([[1,2],[3,4]])
print('第一个数组:')
print(a)
print('\n')
b = np.array([[5,6],[7,8]])
print('第二个数组:')
print(b)
print('\n')
print('水平堆叠:')
c = np.hstack((a,b))
print(c)
print('\n')
# 第一个数组:
[[1 2]
[3 4]]
# 第二个数组:
[[5 6]
[7 8]]
# 水平堆叠:
[[1 2 5 6]
[3 4 7 8]]
import numpy as np
a = np.array([[1,2],[3,4]])
print('第一个数组:')
print(a)
print('\n')
b = np.array([[5,6],[7,8]])
print('第二个数组:')
print(b)
print('\n')
print('垂直堆叠:')
c = np.vstack((a,b))
print(c)
print('\n')
# 第一个数组:
[[1 2]
[3 4]]
# 第二个数组:
[[5 6]
[7 8]]
# 垂直堆叠:
[[1 2]
[3 4]
[5 6]
[7 8]]
方法 | 描述 |
---|---|
split | 将一个数组分割为多个子数组 |
hsplit | 将一个数组水平分割为多个子数组(按列) |
vsplit | 将一个数组竖直分割为多个子数组(按行) |
numpy.split(ary, indices_or_sections, axis)
# ary:被分割的输入数组
# indices_or_sections:可以是整数,表明要从输入数组创建的,等大小的子数组的数量。 如果此参数是一维数组,则其元素表明要创建新子数组的点。
# axis:默认为 0
import numpy as np
a = np.arange(9)
print('第一个数组:')
print(a)
print('\n' )
print('将数组分为三个大小相等的子数组:')
b = np.split(a,3)
print(b)
print('\n' )
print('将数组在一维数组中表明的位置分割:')
b = np.split(a,[4,7])
print(b)
# 第一个数组:
[0 1 2 3 4 5 6 7 8]
# 将数组分为三个大小相等的子数组:
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
# 将数组在一维数组中表明的位置分割:
[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
import numpy as np
a = np.arange(16).reshape(4,4)
print('第一个数组:')
print(a)
print('\n')
print('水平分割:')
b = np.hsplit(a,2)
print(b)
print('\n')
# 第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
# 水平分割:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
import numpy as np
a = np.arange(16).reshape(4,4)
print('第一个数组:')
print(a)
print('\n')
print('竖直分割:')
b = np.vsplit(a,4)
print(b)
print('\n')
# 第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
# 竖直分割:
[array([[0, 1, 2, 3]]),
array([[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11]]),
array([[12, 13, 14, 15]])
]
方法 | 描述 |
---|---|
resize | 返回指定形状的新数组 |
append | 将值添加到数组末尾 |
insert | 沿指定轴将值插入到指定下标之前 |
delete | 返回删掉某个轴的子数组的新数组 |
unique | 寻找数组内的唯一元素 |
numpy.resize(arr, shape)
# arr:要修改大小的输入数组
# shape:返回数组的新形状
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print('第一个数组:')
print(a)
print('\n')
print('第一个数组的形状:')
print(a.shape)
print('\n' )
b = np.resize(a, (3,2))
print('第二个数组:')
print(b)
print('\n')
print('第二个数组的形状:')
print(b.shape)
print('\n')
# 要注意 a 的第一行在 b 中重复出现,因为尺寸变大了
print('修改第二个数组的大小:')
b = np.resize(a,(3,3))
print(b)
# 第一个数组:
[[1 2 3]
[4 5 6]]
# 第一个数组的形状:
(2, 3)
# 第二个数组:
[[1 2]
[3 4]
[5 6]]
# 第二个数组的形状:
(3, 2)
# 修改第二个数组的大小:首先转为2*3然后补了一行
[[1 2 3]
[4 5 6]
[1 2 3]]
numpy.append(arr, values, axis)
# arr:输入数组
# values:要向arr添加的值,比如和arr形状相同(除了要添加的轴)
# axis:沿着它完成操作的轴。如果没有提供,两个参数都会被展开。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print('第一个数组:')
print(a)
print('\n' )
print('向数组添加元素:')
print(np.append(a, [7,8,9]))
print('\n' )
print('沿轴 0 添加元素:')
print(np.append(a, [[7,8,9]],axis = 0))
print('\n')
print ('沿轴 1 添加元素:')
print(np.append(a, [[5,5,5],[7,8,9]],axis = 1))
# 第一个数组:
[[1 2 3]
[4 5 6]]
# 向数组添加元素:
[1 2 3 4 5 6 7 8 9]
# 沿轴 0 添加元素:
[[1 2 3]
[4 5 6]
[7 8 9]]
# 沿轴 1 添加元素:
[[1 2 3 5 5 5]
[4 5 6 7 8 9]]
numpy.insert(arr, obj, values, axis)
# arr:输入数组
# obj:在其之前插入值的索引
# values:要插入的值
# axis:沿着它插入的轴,如果未提供,则输入数组会被展开
import numpy as np
a = np.array([[1,2],[3,4],[5,6]])
print('第一个数组:')
print(a)
print('\n')
print('未传递 Axis 参数。 在插入之前输入数组会被展开。')
print(np.insert(a,3,[11,12]))
print('\n' )
print('传递了 Axis 参数。 会广播值数组来配输入数组。')
print('沿轴 0 广播:')
print(np.insert(a,1,[11],axis = 0))
print('\n')
print('沿轴 1 广播:')
print(np.insert(a,1,11,axis = 1))
# 第一个数组:
[[1 2]
[3 4]
[5 6]]
# 未传递 Axis 参数。 在插入之前输入数组会被展开。
[ 1 2 3 11 12 4 5 6]
# 传递了 Axis 参数。 会广播值数组来配输入数组。
# 沿轴 0 广播:
[[ 1 2]
[11 11]
[ 3 4]
[ 5 6]]
# 沿轴 1 广播:
[[ 1 11 2]
[ 3 11 4]
[ 5 11 6]]
# arr:输入数组
# obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组
# axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开
import numpy as np
a = np.arange(12).reshape(3,4)
print('第一个数组:')
print(a)
print('\n' )
print('未传递 Axis 参数。 在插入之前输入数组会被展开。')
print(np.delete(a,5))
print('\n')
print('删除第二列:')
print(np.delete(a,1,axis = 1))
print('\n')
print('包含从数组中删除的替代值的切片:')
a = np.array([1,2,3,4,5,6,7,8,9,10])
print(np.delete(a, np.s_[::2]))
# 第一个数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
# 未传递 Axis 参数。 在插入之前输入数组会被展开。
[ 0 1 2 3 4 6 7 8 9 10 11]
# 删除第二列:
[[ 0 2 3]
[ 4 6 7]
[ 8 10 11]]
# 包含从数组中删除的替代值的切片:
[ 2 4 6 8 10]
numpy.unique(arr, return_index, return_inverse, return_counts)
# arr:输入数组,如果不是一维数组则会展开
# return_index:如果为true,返回输入数组中的元素下标
# return_inverse:如果为true,返回去重数组的下标,它可以用于重构输入数组
# return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数
import numpy as np
a = np.array([5,2,6,2,7,5,6,8,2,9])
print('第一个数组:')
print(a)
print('\n')
print('第一个数组的去重值:')
u = np.unique(a)
print(u)
print('\n' )
print('去重数组的索引数组:')
u,indices = np.unique(a, return_index = True)
print(indices)
print('\n' )
print('我们可以看到每个和原数组下标对应的数值:')
print(a)
print('\n')
print('去重数组的下标:')
u,indices = np.unique(a,return_inverse = True)
print(u)
print('\n')
print('下标为:')
print(indices)
print('\n')
print('使用下标重构原数组:')
print(u[indices])
print('\n')
print('返回去重元素的重复数量:')
u,indices = np.unique(a,return_counts = True)
print(u)
print(indices)
# 第一个数组:
[5 2 6 2 7 5 6 8 2 9]
# 第一个数组的去重值:
[2 5 6 7 8 9]
# 去重数组的索引数组:
[1 0 2 4 7 9]
# 我们可以看到每个和原数组下标对应的数值:
[5 2 6 2 7 5 6 8 2 9]
# 去重数组的下标:
[2 5 6 7 8 9]
# 下标为:
[1 0 2 0 3 1 2 4 0 5]
# 使用下标重构原数组:
[5 2 6 2 7 5 6 8 2 9]
# 返回去重元素的重复数量:
[2 5 6 7 8 9]
[3 2 2 1 1 1]
Numpy的未运算主要包括了常见的与或非等二进制运算。
方法 | 描述 |
---|---|
bitwise_and | 对数组元素执行位 与 操作 |
bitwise_or | 对数组元素执行位 或 操作 |
invert | 计算位非 |
left_shift | 向左移动二进制表示的位 |
right_shift | 向右移动二进制表示的位 |
import numpy as np
print('13 和 17 的二进制形式:')
a,b = 13,17
# bin() 返回一个整数 int 或者长整数 long int 的二进制表示。
print(bin(a), bin(b))
print('\n')
print('13 和 17 的位与:')
print(np.bitwise_and(13, 17))
# 我们知道二进制与十进制之间的转换是,例如 10 = 1010 即1*2^3+0*2^2+1*2^1+0*2^0。
# 13 和 17 的二进制形式:
0b1101 0b10001
# 13 和 17 的位与:
# 只有同为1的时候为1 10001与 1101 得到 00001
1
import numpy as np
print('13 和 17 的二进制形式:')
a,b = 13,17
print(bin(a), bin(b))
print('\n')
print('13 和 17 的位或:')
print(np.bitwise_or(13, 17))
# 13 和 17 的二进制形式:
0b1101 0b10001
# 13 和 17 的位或:
# 位或操作是只要满足其中一个为1,即为真 1101 或 10001等于 11101 = 16+8+4+1 = 29
29
import numpy as np
print('13 的位反转,其中 ndarray 的 dtype 是 uint8:' )
print(np.invert(np.array([13], dtype = np.uint8)))
print('\n')
# 比较 13 和 242 的二进制表示,我们发现了位的反转
print('13 的二进制表示:')
print(np.binary_repr(13, width = 8))
print('\n')
print('242 的二进制表示:')
print(np.binary_repr(242, width = 8))
# 13 的位反转,其中 ndarray 的 dtype 是 uint8:
[242]
# 13 的二进制表示: 由于我们设置的是int8类型 所以在前面补了4个0
00001101
# np.binary_repr()函数返回给定宽度中十进制数的二进制表示
# 242 的二进制表示:
11110010
import numpy as np
print('将 10 左移两位:')
print(np.left_shift(10,2))
print('\n')
print('10 的二进制表示:')
print(np.binary_repr(10, width = 8))
print('\n')
print('40 的二进制表示:')
print(np.binary_repr(40, width = 8))
# '00001010' 中的两位移动到了左边,并在右边添加了两个 0。
# 将 10 左移两位:
40
# 10 的二进制表示:
00001010
# 40 的二进制表示:
00101000
import numpy as np
print('将 40 右移两位:')
print(np.right_shift(40,2))
print('\n')
print('10 的二进制表示:')
print(np.binary_repr(10, width = 8))
print('\n')
print('40 的二进制表示:')
print(np.binary_repr(40, width = 8))
# '00001010' 中的两位移动到了右边,并在左边添加了两个 0。
# 将 40 右移两位:
10
# 10 的二进制表示:
00001010
# 40 的二进制表示:
00101000
方法 | 描述 |
---|---|
add() | 返回两个str或Unicode数组的逐个字符串连接 |
multiply() | 返回按给定参数多重连接后的字符串 |
center() | 返回给定字符串的副本,其中元素位于特定字符串的中央 |
capitalize() | 返回给定字符串的副本,其中只有第一个字符串大写 |
title() | 返回字符串或 Unicode 的按参数转换成开头字母大写 |
lower() | 返回给定参数每个字符转化为小写的副本 |
upper() | 返回给定参数每个字符转化为大写的副本 |
split() | 返回字符串中的单词列表,并使用分隔符来分割 |
splitlines() | 返回元素中的行列表,以换行符分割 |
strip() | 返回数组副本,其中元素移除了开头或者结尾处的特定字符 |
join() | 返回一个字符串,它是序列中字符串的连接 |
replace() | 返回字符串的副本,其中所有子字符串的出现位置都被新字符串取代 |
decode() | 按参数调用str.decode |
encode() | 按参数调用str.encode |
import numpy as np
print('连接两个字符串:')
print(np.char.add(['hello'],[' world']))
print('\n')
print('连接示例:')
print(np.char.add(['hello', 'world'],[' hello', ' python']))
# 连接两个字符串:
['hello world']
# 连接示例:
['hello hello' 'world python']
import numpy as np
print(np.char.multiply('hello ',3))
# hello hello hello
import numpy as np
# np.char.center(arr, width,fillchar)
print(np.char.center('hello', 10,fillchar = '*'))
# **hello*** 总宽度为10 文本占位为5 其余 5位 *补充分别添加在两侧
print(np.char.center('hello', 11,fillchar = '-'))
# ---hello--- 单数的时候默认多的补在右侧
import numpy as np
print(np.char.capitalize('hello world'))
# Hello world
import numpy as np
print(np.char.capitalize('hello world'))
# Hello World
import numpy as np
print(np.char.lower('HELLO WORLD'))
# hello world
import numpy as np
print(np.char.upper('hello world'))
# HELLO WORLD
import numpy as np
print(np.char.split ('hello how are you?'))
print(np.char.split ('Hello,python,numpy', sep = ','))
# ['hello', 'how', 'are', 'you?']
# ['Hello', 'python', 'numpy']
import numpy as np
print(np.char.splitlines ('hello\rhow are you?'))
print(np.char.splitlines ('Hello,python\nnumpy'))
# ['hello', 'how are you?']
# ['Hello,python', 'numpy']
# '\n','\r','\r\n'都会用作换行符。
import numpy as np
print(np.char.strip ('hello world','@'))
print(np.char.strip (['javascript','python'],'node@'))
# hello world
# ['javascript' 'pyth']
import numpy as np
print(np.char.join(':','ymd'))
print(np.char.join([':','-'],['abc','ymd']))
# y:m:d
# ['a:b:c' 'y-m-d']
import numpy as np
print(np.char.replace ('Lxq is a good gril', 'good', 'pretty'))
# Lxq is a pretty gril
import numpy as np
a = np.char.encode('hello', 'cp500')
print(a)
print(np.char.decode(a,'cp500'))
# b'\x88\x85\x93\x93\x96'
# hello
import numpy as np
a = np.char.encode('hello', 'cp500')
print(a)
# b'\x88\x85\x93\x93\x96'
# 1 弧度 = 360 / 2 π = 180 / π
import numpy as np
a = np.array([0,30,45,60,90])
print('不同角度的正弦值:')
# 通过乘 pi/180 转化为弧度
print(np.sin(a*np.pi/180))
print('\n')
print('数组中角度的余弦值:')
print(np.cos(a*np.pi/180))
print('\n')
print('数组中角度的正切值:')
print(np.tan(a*np.pi/180))
# 不同角度的正弦值:
[0. 0.5 0.70710678 0.8660254 1. ]
# 数组中角度的余弦值:
[1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01
6.12323400e-17]
# 数组中角度的正切值:
[0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+00
1.63312394e+16]
y=sinx ==> x = arcsiny 通过已知对应的y值来求所对应的x弧度值
import numpy as np
a = np.array([0,30,45,60,90])
print('含有正弦值的数组:')
sin = np.around(np.sin(a*np.pi/180),2)
print(sin)
print('\n')
print('计算角度的反正弦,返回值以弧度为单位:')
inv = np.around(np.arcsin(sin),2)
print(inv)
print('\n')
print('通过转化为角度制来检查结果:')
print(np.around(np.degrees(inv)),2)
print('\n')
print('arccos 和 arctan 函数行为类似:')
cos = np.cos(a*np.pi/180)
print(np.around(cos),2)
print('\n')
print('反余弦:')
inv = np.arccos(cos)
print(np.around(inv),2)
print('\n')
print('角度制单位:')
print(np.around(np.degrees(inv)),2)
print('\n')
print('tan 函数:')
tan = np.tan(a*np.pi/180)
print(np.around(tan),2)
print('\n')
print('反正切:')
inv = np.arctan(tan)
print(np.around(inv),2)
print('\n')
print('角度制单位:')
print(np.around(np.degrees(inv)),2)
# 含有正弦值的数组:
[0. 0.5 0.71 0.87 1. ]
# 计算角度的反正弦,返回值以弧度为单位:
[0. 0.52 0.79 1.06 1.57]
# 通过转化为角度制来检查结果:
[ 0. 30. 45. 61. 90.] 2
# arccos 和 arctan 函数行为类似:
[1. 1. 1. 1. 0.] 2
# 反余弦:
[0. 1. 1. 1. 2.] 2
# 角度制单位:
[ 0. 30. 45. 60. 90.] 2
# tan 函数:
[0.00000000e+00 1.00000000e+00 1.00000000e+00 2.00000000e+00
1.63312394e+16] 2
# 反正切:
[0. 1. 1. 1. 2.] 2
# 角度制单位:
[ 0. 30. 45. 60. 90.] 2
参数 | 描述 |
---|---|
a | 输入数组 |
decimals | 要舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置 |
import numpy as np
a = 1.0455333
b = [1.034,5.36,3.999]
print(np.around(a,2))
print(np.around(b,2))
# 1.05
# [1.03 5.36 4. ]
import numpy as np
a = np.array([-1.7, 1.5, -0.2, 0.6, 10])
print('提供的数组:')
print(a)
print('\n')
print('修改后的数组:')
print(np.floor(a))
# 提供的数组:
[-1.7 1.5 -0.2 0.6 10. ]
# 修改后的数组:
[-2. 1. -1. 0. 10.]
import numpy as np
a = np.array([-1.7, 1.5, -0.2, 0.6, 10])
print('提供的数组:')
print(a)
print('\n')
print('修改后的数组:')
print(np.ceil(a))
# 提供的数组:
[-1.7 1.5 -0.2 0.6 10. ]
# 修改后的数组:
[-1. 2. -0. 1. 10.]
算术运算包括add(),subtract(),multiply()和divide())等方法,其中输入数组必须具有相同的形状或符合数组广播规则:
import numpy as np
a = np.arange(4, dtype = np.float_).reshape(2,2)
print('第一个数组:')
print(a)
print('\n')
print('第二个数组:')
b = np.array([10,10])
print(b)
print('\n')
print('两个数组相加:')
print(np.add(a,b))
print('\n')
print('两个数组相减:')
print(np.subtract(a,b))
print('\n')
print('两个数组相乘:')
print(np.multiply(a,b))
print('\n')
print('两个数组相除:')
print(np.divide(a,b))
# 第一个数组:
[[0. 1.]
[2. 3.]]
# 第二个数组:
[10 10]
# 两个数组相加:
[[10. 11.]
[12. 13.]]
# 两个数组相减:
[[-10. -9.]
[ -8. -7.]]
# 两个数组相乘:
[[ 0. 10.]
[20. 30.]]
# 两个数组相除:
[[0. 0.1]
[0.2 0.3]]
import numpy as np
a = np.array([0.25, 1.5, 1, 0, 100])
print('我们的数组是:')
print(a)
print('\n')
print('调用 reciprocal 函数:')
print(np.reciprocal(a))
print('\n')
b = np.array([100], dtype = int)
print('第二个数组:')
print(b)
print('\n')
print('调用 reciprocal 函数:')
print(np.reciprocal(b))
# 我们的数组是:
[ 0.25 1.5 1. 0. 100. ]
# 调用 reciprocal 函数: 对于整数 0,则发出溢出警告
/__dirname/test.py:7: RuntimeWarning: divide byzero encountered in reciprocal
print(np.reciprocal(a))
[4. 0.66666667 1. inf 0.01 ]
# 第二个数组:
[100]
# 调用 reciprocal 函数: 对于绝对值大于 1 的整数元素,结果始终为 0
[0]
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(np.power(a,2))
# [ 1 4 9 16 25]
import numpy as np
a = np.array([10,20,30])
b = np.array([3,5,7])
print(np.mod(a,b))
# [1 0 2]
以下函数用于操作复数:
方法 | 描述 |
---|---|
numpy.real() | 返回复数类型参数的实部 |
numpy.imag() | 返回复数类型参数的虚部 |
numpy.conj() | 返回通过改变虚部的符号而获得的共轭复数 |
numpy.angle() | 返回复数参数的角度。 函数的参数是degree。 如果为true,返回的角度以角度制来表示,否则为以弧度制来表示 |
import numpy as np
a = np.array([-5.6j, 0.2j, 11. , 1+1j])
print('我们的数组是:')
print(a)
print('\n')
print('调用 real() 函数:')
print(np.real(a))
print('\n')
print('调用 imag() 函数:')
print(np.imag(a))
print('\n')
print('调用 conj() 函数:')
print(np.conj(a))
print('\n')
print('调用 angle() 函数:')
print(np.angle(a))
print('\n')
print('再次调用 angle() 函数(以角度制返回):')
print(np.angle(a, deg = True))
# 我们的数组是:
[-0.-5.6j 0.+0.2j 11.+0. j 1.+1. j]
# 调用 real() 函数:
[-0. 0. 11. 1.]
# 调用 imag() 函数:
[-5.6 0.2 0. 1. ]
# 调用 conj() 函数:
[-0.+5.6j 0.-0.2j 11.-0. j 1.-1. j]
# 调用 angle() 函数:
[-1.57079633 1.57079633 0. 0.78539816]
# 再次调用 angle() 函数(以角度制返回):
[-90. 90. 0. 45.]
方法 | 描述 |
---|---|
numpy.amin() | 从给定数组中的元素沿指定轴返回最小值 |
numpy.amax() | 从给定数组中的元素沿指定轴返回最大值 |
numpy.ptp() | 返回沿轴的值的范围(最大值 - 最小值) |
numpy.percentile() | 百分位数是统计中使用的度量,表示小于这个值得观察值占某个百分比 |
numpy.median() | 定义为将数据样本的上半部分与下半部分分开的值 |
numpy.mean() | 返回数组中元素的算术平均值 |
numpy.average() | 根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值 |
标准差 | 标准差是与均值的偏差的平方的平均值的平方根 |
import numpy as np
a = np.array([[3,7,5],[8,4,3]])
print(np.amin(a,0))
print(np.amin(a,1))
b = np.array([[3,7,5],[8,4,3],[2,4,9]])
print(np.amax(b,0))
print(np.amax(b,1))
# [3 4 3]
# [3 3]
# [8 7 9]
# [7 8 9]
# 实际上axis = 1,指的是沿着行求所有列,代表了横轴,那axis = 0,就是沿着列求所有行,代表了纵轴。
import numpy as np
b = np.array([[3,7,5],[8,4,3],[2,4,9]])
print(np.ptp(b))
print(np.ptp(b,0))
print(np.ptp(b,1))
# 7 不传轴的时候和=默认返回所有数据的对比
# [6 3 6] 对比纵轴
# [4 5 7] 对比横轴
numpy.percentile(a, q, axis)
# a 输入数组
# q 要计算的百分位数,在 0 ~ 100 之间
# axis 沿着它计算百分位数的轴
import numpy as np
a = np.array([[30,40,70],[80,20,10],[50,90,60]])
print('我们的数组是:' )
print(a)
print('\n')
print('调用 percentile() 函数:')
print(np.percentile(a,50))
print('\n')
print('沿轴 1 调用 percentile() 函数:')
print(np.percentile(a,50, axis = 1) )
print('\n')
print('沿轴 0 调用 percentile() 函数:')
print(np.percentile(a,50, axis = 0))
# 我们的数组是:
[[30 40 70]
[80 20 10]
[50 90 60]]
# 调用 percentile() 函数:
50.0
# 沿轴 1 调用 percentile() 函数:
[40. 20. 60.]
# 沿轴 0 调用 percentile() 函数:
[50. 40. 60.]
import numpy as np
a = np.array([[30,40,70],[80,20,10],[50,90,60]])
print('我们的数组是:' )
print(a)
print('\n')
print('调用 median() 函数:')
print(np.median(a))
print('\n')
print('沿轴 1 调用 median() 函数:')
print(np.median(a,axis = 1) )
print('\n')
print('沿轴 0 调用 median() 函数:')
print(np.median(a, axis = 0))
# 我们的数组是:
[[30 40 70]
[80 20 10]
[50 90 60]]
# 调用 median() 函数:
50.0
# 沿轴 1 调用 median() 函数:
[40. 20. 60.]
# 沿轴 0 调用 median() 函数:
[50. 40. 60.]
算术平均值是数组中所有元素相加后除以数组的元素个数得到的值。
import numpy as np
a = np.array([10,20,30,40])
b = np.array([[30,40,70],[80,20,10],[50,90,60]])
print(np.mean(a))
print(np.mean(b))
print(np.mean(b,axis=0))
print(np.mean(b,axis=1))
# 25.0
# 50.0
# [53.33333333 50. 46.66666667]
# [46.66666667 36.66666667 66.66666667]
加权平均值是由每个分量乘以反映其重要性的因子得到的平均值
import numpy as np
a = np.array([1,2,3,4])
print('我们的数组是:')
print(a)
print('\n')
print('调用 average() 函数:')
print(np.average(a))
print('\n')
# 不指定权重时相当于 mean 函数
wts = np.array([4,3,2,1])
print('再次调用 average() 函数:')
print(np.average(a,weights = wts))
print('\n')
# 如果 returned 参数设为 true,则返回权重的和
print('权重的和:')
print(np.average([1,2,3, 4],weights = [4,3,2,1], returned = True))
# 我们的数组是:
[1 2 3 4]
# 调用 average() 函数: 10 / 4 = 2.5
2.5
# 再次调用 average() 函数: 0.4+0.6+0.6+0.4 = 2.0
2.0
# 权重的和:
(2.0, 10.0)
std = sqrt(mean((x - x.mean())**2))
# 如果数组是[1,2,3,4],则其平均值为2.5。
# 因此,差的平方是[2.25,0.25,0.25,2.25],并且其平均值的平方根除以4,即sqrt(5/4)是1.1180339887498949
import numpy as np
print(np.std([1,2,3,4]))
# 1.118033988749895
import numpy as np
print(np.var([1,2,3,4]))
# 1.25
常用排序算法:
分类 | 速度 | 最坏情况 | 工作空间 | 稳定性 |
---|---|---|---|---|
‘quicksort’(快速排序) | 1 | 1 | O(n^2) | 0 |
‘mergesort’(归并排序) | 2 | 1 | O(n*log(n)) | ~n/2 |
‘heapsort’(堆排序) | 3 | 1 | O(n*log(n)) | 0 |
numpy.sort(a, axis, kind, order)
# a 要排序的数组
# axis 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序
# kind 默认为'quicksort'(快速排序)
# order 如果数组包含字段,则是要排序的字段
# print(np.var([1,2,3,4]))
import numpy as np
a = np.array([[3,7],[9,1]])
print('我们的数组是:')
print(a)
print('\n')
print('调用 sort() 函数:')
print(np.sort(a))
print('\n')
print('沿轴 0 排序:')
print(np.sort(a, axis = 0))
print('\n')
# 在 sort 函数中排序字段
dt = np.dtype([('name', 'S10'),('age', int)])
a = np.array([("raju",21),("anil",25),("ravi", 17), ("amar",27)], dtype = dt)
print('我们的数组是:')
print(a)
print('\n')
print('按 name 排序:')
print(np.sort(a, order = 'name'))
# 我们的数组是:
[[3 7]
[9 1]]
# 调用 sort() 函数:
[[3 7]
[1 9]]
# 沿轴 0 排序:
[[3 1]
[9 7]]
# 我们的数组是:
[(b'raju', 21) (b'anil', 25) (b'ravi', 17) (b'amar', 27)]
# 按 name 排序:
[(b'amar', 27) (b'anil', 25) (b'raju', 21) (b'ravi', 17)]
返回的是数组值从小到大的索引值
import numpy as np
x = np.array([3, 1, 2])
print('我们的数组是:')
print(x)
print('\n')
print('对 x 调用 argsort() 函数:')
y = np.argsort(x)
print(y)
print('\n')
print('以排序后的顺序重构原数组:')
print(x[y])
print('\n')
print('使用循环重构原数组:')
for i in y:
print(x[i]),
# 我们的数组是:
[3 1 2]
# 对 x 调用 argsort() 函数:
[1 2 0]
# 以排序后的顺序重构原数组:
[1 2 3]
# 使用循环重构原数组:
1
2
3
# print(np.var([1,2,3,4]))
import numpy as np
a = [1,5,1,4,3,4,4] # First column
b = [9,4,0,4,0,2,1] # Second column
ind = np.lexsort((b,a))
print(int)
# 2 0 4 6 5 3 1
# 分析:
# b在前,a在后,即是先按照a的元素进行比较
# step1 调用argsort(a) [1,5,1,4,3,4,4] => [1,1,3,4,4,4,5] => [0,2,4,3,5,6,1]
# 得到 a的排序结果索引后计算得到b对应的排序结果
# step2 调用argsort(b,a) [9,4,0,4,0,2,1] -- [0,2,4,3,5,6,1] => [9,0,0,4,2,1,4]
# 得到b的排序结果后与a的排序结果进行比较 按照a优先的顺序进行排列
# [1,1,3,4,4,4,5]
# [9,0,0,4,2,1,4]
# step3 我们发现 [1,0]最小 对应 原始数组索引 2
# step4 我们发现 [1,9]最小 对应 原始数组索引 0
# step5 我们发现 [3,0]最小 对应 原始数组索引 4
# step6 我们发现 [4,1]最小 对应 原始数组索引 6
# step7 我们发现 [4,2]最小 对应 原始数组索引 5
# step8 我们发现 [4,4]最小 对应 原始数组索引 3
# step9 我们发现 [5,4]最小 对应 原始数组索引 1
同理:我们可以将b放在前检验我们是否理解这个排序
ind2 = np.lexsort((a,b))
print(int2)
# [2 4 6 5 3 1 0]
根据上述的栗子我们可以发现,lexsort()其实就是现实生活中的两者之间的比较得到一个以某个为主要参考物后,来得到排序的结果,简单来说比如说,我想要购买一件衣服,我主要参考衣服的颜色和价格,假如我觉得价格比较重要,那么我会优先根据价格进行排序,排序完成之后然后根据价格排序得到的结果去根据颜色进行排序,最后得到性价比比较满意的结果。或者我可以先根据颜色进行排序,然后再根据价格进行排序来得到结果。
import numpy as np
a = np.array([[30,40,70],[80,20,10],[50,90,60]])
print('我们的数组是:')
print(a)
print('\n')
print('调用 argmax() 函数:')
print(np.argmax(a))
print('\n')
print('展开数组:')
print(a.flatten())
print('\n')
print('沿轴 0 的最大值索引:')
maxindex = np.argmax(a, axis = 0)
print(maxindex)
print('\n')
print('沿轴 1 的最大值索引:' )
maxindex = np.argmax(a, axis = 1)
print(maxindex )
print('\n')
print('调用 argmin() 函数:')
minindex = np.argmin(a)
print(minindex )
print('\n')
print('展开数组中的最小值:')
print(a.flatten()[minindex])
print('\n')
print('沿轴 0 的最小值索引:')
minindex = np.argmin(a, axis = 0)
print(minindex)
print('\n')
print('沿轴 1 的最小值索引:' )
minindex = np.argmin(a, axis = 1)
print(minindex)
# 我们的数组是:
[[30 40 70]
[80 20 10]
[50 90 60]]
# 调用 argmax() 函数:
7
# 展开数组:
[30 40 70 80 20 10 50 90 60]
# 沿轴 0 的最大值索引:
[1 2 0]
# 沿轴 1 的最大值索引:
[2 0 1]
# 调用 argmin() 函数:
5
# 展开数组中的最小值:
10
# 沿轴 0 的最小值索引:
[0 1 1]
# 沿轴 1 的最小值索引:
[0 2 0]
import numpy as np
a = np.array([[30,40,0],[0,20,10],[50,0,60]])
print('我们的数组是:')
print(a)
print('\n')
print('调用 nonzero() 函数:')
print(np.nonzero (a))
# 我们的数组是:
[[30 40 0]
[ 0 20 10]
[50 0 60]]
# 调用 nonzero() 函数: 先返回x轴坐标 再返回y轴坐标
(array([0, 0, 1, 1, 2, 2]), array([0, 1, 1, 2, 0, 2]))
import numpy as np
x = np.arange(9.).reshape(3, 3)
print('我们的数组是:')
print(x)
print('大于 3 的元素的索引:')
y = np.where(x > 3)
print(y)
print('使用这些索引来获取满足条件的元素:')
print(x[y])
# 我们的数组是:
[[0. 1. 2.]
[3. 4. 5.]
[6. 7. 8.]]
# 大于 3 的元素的索引:
(array([1, 1, 2, 2, 2]), array([1, 2, 0, 1, 2]))
#使用这些索引来获取满足条件的元素:
[4. 5. 6. 7. 8.]
import numpy as np
x = np.arange(9.).reshape(3, 3)
print('我们的数组是:')
print(x)
# 定义条件
condition = np.mod(x,2) == 0
print('按元素的条件值:')
print(condition)
print('使用条件提取元素:')
print(np.extract(condition, x))
# 我们的数组是:
[[0. 1. 2.]
[3. 4. 5.]
[6. 7. 8.]]
# 按元素的条件值:
[[ True False True]
[False True False]
[ True False True]]
# 使用条件提取元素:
[0. 2. 4. 6. 8.]
本篇教程比较长,但是完整学习下来也是很有帮助,大家一起��努力把。