NumPy学习(一)

NumPy学习(一)

1.NumPy简介

NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。

使用

  • 使用pip安装numpy

    pip install numpy

  • 引用numpy库

    import numpy as np

2.Ndarray对象

Ndarray即N维数组类型。

声明

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.ndmin 指定返回数组的最小维数。
示例
一维数组

输入为:

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

输出:

[1, 2, 3]

多于一维

输入:

a = np.array([[1,  2],  [3,  4]])  
print(a)

输出:

[[1, 2]
 [3, 4]]

最小维度

输入:

a = np.array([1,  2,  3,4,5], ndmin =  2)  
print(a)

输出:

[[1, 2, 3, 4, 5]]

dtype参数

输入:

a = np.array([1,  2,  3], dtype = complex)  # 数据类型为复数
print(a)

输出:

[ 1.+0.j,  2.+0.j,  3.+0.j]

3.NumPy数据类型

NumPy 支持比 Python 更多种类的数值类型。 下表显示了 NumPy 中定义的不同标量数据类型。

序号数据类型及描述
1.bool_ 存储为一个字节的布尔值(真或假)
2.int_ 默认整数,相当于 C 的long,通常为int32int64
3.intc 相当于 C 的int,通常为int32int64
4.intp 用于索引的整数,相当于 C 的size_t,通常为int32int64
5.int8 字节(-128 ~ 127)
6.int16 16 位整数(-32768 ~ 32767)
7.int32 32 位整数(-2147483648 ~ 2147483647)
8.int64 64 位整数(-9223372036854775808 ~ 9223372036854775807)
9.uint8 8 位无符号整数(0 ~ 255)
10.uint16 16 位无符号整数(0 ~ 65535)
11.uint32 32 位无符号整数(0 ~ 4294967295)
12.uint64 64 位无符号整数(0 ~ 18446744073709551615)
13.float_ float64的简写
14.float16 半精度浮点:符号位,5 位指数,10 位尾数
15.float32 单精度浮点:符号位,8 位指数,23 位尾数
16.float64 双精度浮点:符号位,11 位指数,52 位尾数
17.complex_ complex128的简写
18.complex64 复数,由两个 32 位浮点表示(实部和虚部)
19.complex128 复数,由两个 64 位浮点表示(实部和虚部)

数据类型对象

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

  • 数据类型(整数、浮点或者 Python 对象)
  • 数据大小
  • 字节序(小端或大端)
  • 在结构化类型的情况下,字段的名称,每个字段的数据类型,和每个字段占用的内存块部分。
  • 如果数据类型是子序列,它的形状和数据类型。

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

dtype可由一下语法构造:

np.dtype(object, align, copy)

参数为:

  • Object:被转换为数据类型的对象。
  • Align: 如果为true,则向字段添加间隔,使其类似 C 的结构体。
  • Copy : 生成dtype对象的新副本,如果为flase,结果是内建数据类型对象的引用。

4.NumPy数组属性

np.shape

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

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

输出如下:

(2, 3)

示例 2
# 这会调整数组大小  
import numpy as np
a = np.array([[1,2,3],[4,5,6]]) a.shape =  (3,2)
print(a)

输出如下:

[[1, 2] 
 [3, 4] 
 [5, 6]]
 
示例 3

NumPy 也提供了reshape函数来调整数组大小。

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

输出如下:

[[1, 2] 
 [3, 4] 
 [5, 6]]
 

ndarray.ndim

这一数组属性返回数组的维数。

示例 1
# 等间隔数字的数组  
import numpy as np 
a = np.arange(10)
print(a)

输出如下:

[0 1  2  3  4  5  6  7  8  9] 

示例 2
# 一维数组
import numpy as np 
a = np.arange(10)
print(a.ndim) 
# 现在调整其大小
b = a.reshape(2,4,3)  
print(b.ndim)  # b 现在拥有三个维度

输出如下:

1
3
 

numpy.itemsize

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

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

输出如下:

1

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

输出如下:

4

5.NumPy - 数组创建例程

新的ndarray对象可以通过任何下列数组创建例程或使用低级ndarray构造函数构造。

numpy.empty

它创建指定形状和dtype的未初始化数组。 它使用以下构造函数:

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

构造器接受下列参数:

序号参数及描述
1.Shape 空数组的形状,整数或整数元组
2.Dtype 所需的输出数组类型,可选
3.Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组
示例

下面的代码展示空数组的例子:

import numpy as np 
x = np.empty([3,2], dtype =  int)  
print(x)

输出如下:

[[22649312    1701344351] 
 [1818321759  1885959276] 
 [16779776    156368896]]
 

注意:数组元素为随机值,因为它们未初始化。

numpy.zeros

返回特定大小,以 0 填充的新数组。

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

构造器接受下列参数:

序号参数及描述
1.Shape 空数组的形状,整数或整数元组
2.Dtype 所需的输出数组类型,可选
3.Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组
示例 1
# 含有 5 个 0 的数组,默认类型为 float  
import numpy as np 
x = np.zeros(5)  
print(x)

输出如下:

[ 0.  0.  0.  0.  0.]
 
示例 2
import numpy as np 
x = np.zeros((5,), dtype = np.int)  
print(x)

输出如下:

[0  0  0  0  0]

示例 3
# 自定义类型 
import numpy as np 
x = np.zeros((2,2), dtype =  [('x',  'i4'),  ('y',  'i4')])  
print(x)

输出如下:

[[(0,0)(0,0)]
 [(0,0)(0,0)]]         

numpy.ones

返回特定大小,以 1 填充的新数组。

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

构造器接受下列参数:

序号参数及描述
1.Shape 空数组的形状,整数或整数元组
2.Dtype 所需的输出数组类型,可选
3.Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组
示例 1
# 含有 5 个 1 的数组,默认类型为 float  
import numpy as np 
x = np.ones(5)  
print(x)

输出如下:

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

输出如下:

[[1  1] 
 [1  1]]
 

6.NumPy - 来自现有数据的数组

这一章中,我们会讨论如何从现有数据创建数组。

numpy.asarray

此函数类似于numpy.array,除了它有较少的参数。 这个例程对于将 Python 序列转换为ndarray非常有用。

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

构造器接受下列参数:

序号参数及描述
1.a 任意形式的输入参数,比如列表、列表的元组、元组、元组的元组、元组的列表
2.dtype 通常,输入数据的类型会应用到返回的ndarray
3.order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组

下面的例子展示了如何使用asarray函数:

示例 1
# 将列表转换为 ndarray 
import numpy as np 
x =  [1,2,3] 
a = np.asarray(x)  
print(a)

输出如下:

[1  2  3] 

示例 2
# 设置了 dtype  
import numpy as np 
x =  [1,2,3] 
a = np.asarray(x, dtype = float)  
print(a)

输出如下:

[ 1.  2.  3.] 

示例 3
# 来自元组的 ndarray  
import numpy as np 
x =  (1,2,3) 
a = np.asarray(x)  
print(a)

输出如下:

[1  2  3]

示例 4
# 来自元组列表的 ndarray
import numpy as np 
x =  [(1,2,3),(4,5)] 
a = np.asarray(x)  
print(a)

输出如下:

[(1, 2, 3) (4, 5)]

numpy.frombuffer

此函数将缓冲区解释为一维数组。 暴露缓冲区接口的任何对象都用作参数来返回ndarray

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

构造器接受下列参数:

序号参数及描述
1.buffer 任何暴露缓冲区借口的对象
2.dtype 返回数组的数据类型,默认为float
3.count 需要读取的数据数量,默认为-1,读取所有数据
4.offset 需要读取的起始位置,默认为0
示例

下面的例子展示了frombuffer函数的用法。

import numpy as np 
s = 'Hello World' 
a = np.frombuffer(s, dtype =  'S1')  
print(a)

输出如下:

['H'  'e'  'l'  'l'  'o'  ' '  'W'  'o'  'r'  'l'  'd']

numpy.fromiter

此函数从任何可迭代对象构建一个ndarray对象,返回一个新的一维数组。

numpy.fromiter(iterable, dtype, count = -1)

构造器接受下列参数:

序号参数及描述
1.iterable 任何可迭代对象
2.dtype 返回数组的数据类型
3.count 需要读取的数据数量,默认为-1,读取所有数据

以下示例展示了如何使用内置的range()函数返回列表对象。 此列表的迭代器用于形成ndarray对象。

示例 1
# 使用 range 函数创建列表对象  
import numpy as np 
list = range(5)  
print(list)

输出如下:

[0,  1,  2,  3,  4]
示例 2
# 从列表中获得迭代器  
import numpy as np 
list = range(5) 
it = iter(list)  
# 使用迭代器创建 ndarray 
x = np.fromiter(it, dtype =  float)  
print(x)

输出如下:

[0.   1.   2.   3.   4.]

7.NumPy - 来自数值范围的数组

这一章中,我们会学到如何从数值范围创建数组。

numpy.arange

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

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

构造器接受下列参数:

序号参数及描述
1.start 范围的起始值,默认为0
2.stop 范围的终止值(不包含)
3.step 两个值的间隔,默认为1
4.dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。

下面的例子展示了如何使用该函数:

示例 1
import numpy as np
x = np.arange(5)  
print x

输出如下:

[0  1  2  3  4]
 
示例 2
import numpy as np
# 设置了 dtype
x = np.arange(5, dtype =  float)  
print(x)

输出如下:

[0.  1.  2.  3.  4.]

示例 3
# 设置了起始值和终止值参数  
import numpy as np
x = np.arange(10,20,2)  
print(x)

输出如下:

[10  12  14  16  18]

numpy.linspace

此函数类似于arange()函数。 在此函数中,指定了范围之间的均匀间隔数量,而不是步长。 此函数的用法如下。

numpy.linspace(start, stop, num, endpoint, retstep, dtype) 

构造器接受下列参数:

序号参数及描述
1.start 序列的起始值
2.stop 序列的终止值,如果endpointtrue,该值包含于序列中
3.num 要生成的等间隔样例数量,默认为50
4.endpoint 序列中是否包含stop值,默认为ture
5.retstep 如果为true,返回样例,以及连续数字之间的步长
6.dtype 输出ndarray的数据类型

下面的例子展示了linspace函数的用法。

示例 1
import numpy as np
x = np.linspace(10,20,5) 
print(x)

输出如下:

[10.   12.5   15.   17.5  20.]
示例 2
# 将 endpoint 设为 false
import numpy as np
x = np.linspace(10,20,  5, endpoint =  False)  
print(x)

输出如下:

[10.   12.   14.   16.   18.]

示例 3
# 输出 retstep 值  
import numpy as np
x = np.linspace(1,2,5, retstep =  True)  
print(x)
# 这里的 retstep 为 0.25

输出如下:

(array([ 1.  ,  1.25,  1.5 ,  1.75,  2.  ]), 0.25)

numpy.logspace

此函数返回一个ndarray对象,其中包含在对数刻度上均匀分布的数字。 刻度的开始和结束端点是某个底数的幂,通常为 10。

numpy.logscale(start, stop, num, endpoint, base, dtype) 

logspace函数的输出由以下参数决定:

序号参数及描述
1.start 起始值是base ** start
2.stop 终止值是base ** stop
3.num 范围内的数值数量,默认为50
4.endpoint 如果为true,终止值包含在输出数组当中
5.base 对数空间的底数,默认为10
6.dtype 输出数组的数据类型,如果没有提供,则取决于其它参数

下面的例子展示了logspace函数的用法。

示例 1
import numpy as np
# 默认底数是 10
a = np.logspace(1.0,  2.0, num =  10)  
print(a)

输出如下:

[ 10.           12.91549665     16.68100537      21.5443469  27.82559402      
  35.93813664   46.41588834     59.94842503      77.42636827    100.    ]

示例 2
# 将对数空间的底数设置为 2  
import numpy as np
a = np.logspace(1,10,num =  10,  base  =  2)  
print(a)

输出如下:

[ 2.     4.     8.    16.    32.    64.   128.   256.    512.   1024.]
 

8.NumPy - 切片和索引

ndarray对象的内容可以通过索引或切片来访问和修改,就像 Python 的内置容器对象一样。

如前所述,ndarray对象中的元素遵循基于零的索引。 有三种可用的索引方法类型: 字段访问,基本切片高级索引

基本切片是 Python 中基本切片概念到 n 维的扩展。 通过将startstopstep参数提供给内置的slice函数来构造一个 Python slice对象。 此slice对象被传递给数组来提取数组的一部分。

示例 1

import numpy as np
a = np.arange(10)
s = slice(2,7,2)  
print(a[s])

输出如下:

[2  4  6]

在上面的例子中,ndarray对象由arange()函数创建。 然后,分别用起始,终止和步长值272定义切片对象。 当这个切片对象传递给ndarray时,会对它的一部分进行切片,从索引27,步长为2

通过将由冒号分隔的切片参数(start:stop:step)直接提供给ndarray对象,也可以获得相同的结果。

示例 2

import numpy as np
a = np.arange(10)
b = a[2:7:2]  
print(b)

输出如下:

[2  4  6]

如果只输入一个参数,则将返回与索引对应的单个项目。 如果使用a:,则从该索引向后的所有项目将被提取。 如果使用两个参数(以:分隔),则对两个索引(不包括停止索引)之间的元素以默认步骤进行切片。

示例 3

# 对单个元素进行切片  
import numpy as np
a = np.arange(10)
b = a[5]  
print(b)

输出如下:

5

示例 4

# 对始于索引的元素进行切片  
import numpy as np
a = np.arange(10)  
print(a[2:])

输出如下:

[2  3  4  5  6  7  8  9]

示例 5

# 对索引之间的元素进行切片  
import numpy as np
a = np.arange(10)  
print(a[2:5])

输出如下:

[2  3  4]

上面的描述也可用于多维ndarray

示例 6

import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print a
# 对始于索引的元素进行切片  
print('现在我们从索引 a[1:] 开始对数组切片')
print(a[1:])

输出如下:

[[1 2 3]
 [3 4 5]
 [4 5 6]]
现在我们从索引 a[1:] 开始对数组切片
[[3 4 5]
 [4 5 6]]

切片还可以包括省略号(...),来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的ndarray

示例 7

# 最开始的数组  
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print('我们的数组是:')
print(a)
print('\n')
# 这会返回第二列元素的数组:  
print('第二列的元素是:')
print(a[...,1])  
print('\n')  
# 现在我们从第二行切片所有元素:  
print('第二行的元素是:')
print(a[1,...])  
print('\n')
# 现在我们从第二列向后切片所有元素:
print('第二列及其剩余元素是:')  
print(a[...,1:])

输出如下:

我们的数组是:
[[1 2 3]
 [3 4 5]
 [4 5 6]]
第二列的元素是:
[2 4 5]
第二行的元素是:
[3 4 5]
第二列及其剩余元素是:
[[2 3]
 [4 5]
 [5 6]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值