首页Python2.Numpy库——nda...

2.Numpy库——ndarray多维数组对象介绍

1.Numpy库介绍:

Numpy是Numercial Python的简称,是一个开源的Python科学计算基础库。

  • 提供一个强大的N维数组对象ndarray,并提供了基于数组的算术操作及广播功能函数;
  • 整合C/C++/Fortran代码工具;
  • 线性代数、傅里叶变换、随机数生成等功能。

Numpy是Scipy、Pandas等数据处理或科学计算库的基础。
Numpy的引用直接使用以下语句即可:

import numpy as np # 尽管别名可以省略或者修改,建议使用上述约定的别名

2.多维数组对象ndarray的设置原因:

Python中可以利用列表表示数组,那Numpy为什么还要设置ndarray那?
例如,计算A²+B²,其中A和B是一维数组。
在python语法中,需要利用循环结构,计算数组中的每个数据。

def pysum():
    a = [0,1,2,3,4]
    b = [9,8,7,6,5]
    c = []
    
    for i in range(len(a)):
        c.append(a[i]**2 + b[i]**3)
    return c
print(pysum())

而NUmpy则把一个一维数据作为单个数据,直接进行计算。

import numpy as np

def npsum():
    a = np.array([0,1,2,3,4])
    b = np.array([9,8,7,6,5])
    c = a**2 + b**3
    return c 
print(npsum())

从上面例子中可以看出,N维数组对象ndarray:

  • 数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据。
  • 设置专门的数组对象,经过优化,可以提升这类应用的运算速度(numpy底层是由C语言编写,计算速度更快)。
  • 数组对象采用相同的数据类型,有助于节省运算和存储空间(因为在科学计算中,一个维度所有数据的类型往往是相同的)。

3.多维数组对象ndarray:

ndarray是Python中一个快速、灵活的大型数据集容器,作为一个多维数组对象,由两部分构成:

  • 实际的数据;
  • 描述这些数据的元数据(数据维度、数据类型等):
    ndarray数组一般要求所有要素类型相同(同质),数组下标从0开始(但也有特殊情况)。
    轴(axis):保存数据的维度。
    秩(rank):轴的数量。

4.生成ndarray:

生成数组最简单的方法就是使用array函数,array函数接收任意的序列型对象(sequence-like object),生成一个Numpy数组。

# 当np.array()没有显式地指定dtype时,numpy将根据数据情况字段推断生成一个数据类型
x = np.array(list/tuple)
x = np.array(list/tuple,dtype=np.float32)

数组生成函数列表:

函数说明
np.array()—-
np.asarray()将输入转换为ndarray,但是如果输入已经是ndarray则不再复制
np.arange(n)类似range()函数,返回ndarray类型,元素从0到n-1
np.ones(shape)根据shape生成一个全1数组,shape是元祖类型
np.ones_like(a)根据数组a的形状生成一个全1数组
np.zeros(shape)根据shape生成一个全0数组,shape是元祖类型
np.zeros_like(a)根据数组a的形状生成一个全0数组
np.empty(shape)根据shape生成一个没有初始化数值的空数组,shape是元祖类型
np.empty_like(a)根据数组a的形状生成一个没有初始化数值的空数组
np.full(shape,val)根据shape生成一个数组,每个元素都是val
np.full_like(a,val)根据数组a的形状生成一个数组,每个元素值都是val
np.eye(n)创建一个正方的n×n单位矩阵,对角线为1,其余为0
np.linspace(start, stop, num)根据起始值及间隔数量num等间距地填充数据,形成数组

TIPS:使用numpy.empty生成一个全部为0的数组是不安全的。该函数返回未初始化的内存,因此可能包含非零的 “垃圾 “值。只有当你打算用数据填充新的数组时,你才应该使用该函数。

arr = np.arange(10)
arr
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

np.ones_like(arr)
# array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

np.zeros((2,3))
# array([[0., 0., 0.],
#        [0., 0., 0.]])

np.full((2,3) , 99)
# array([[99, 99, 99],
#        [99, 99, 99]])

np.eye(5)
# array([[1., 0., 0., 0., 0.],
#        [0., 1., 0., 0., 0.],
#        [0., 0., 1., 0., 0.],
#        [0., 0., 0., 1., 0.],
#        [0., 0., 0., 0., 1.]])

np.linspace(0,10 , num=5)
# array([ 0. ,  2.5,  5. ,  7.5, 10. ])

5.ndarray对象的属性:

通过下述函数可以查看数组的相应属性信息。

属性说明
.ndim秩,即轴的数量或维度的数量
.shapendarray对象尺度,对于矩阵,n行m列
.sizendarray对象元素的个数,相当于.shape中n×m的值
.dtypendarray对象的元素类型
.astype转换ndarray对象的数据类型
.itemsizendarray对象中每个元素的大小,以字节为单位
import numpy as np

a = np.array([[0,1,2,3,4],[9,8,7,6,5]])

a.ndim
# 2

a.shape
# (2, 5)

a.size
# 10

a.dtype
# dtype('int32')

a.itemsize
# 4

6.ndarray对象的数据类型:

从上面实例中看到a.dtype返回的类型是int32,这个类型在基础的python语法中并不存在,它是numpy定义的元素类型,除此之外,numpy还有很多其他元素类型:

数据类型说明
bool布尔类型,True或False
intc与C语言中的int类型一致,一般是int32或int64
intp用于索引的整数,与C语言中ssize_t一致,int32或int64
int8字节长度的整数,取值:[-128,127]
int1616位长度的整数,取值:[-32768,32767]
int3232位长度的整数,取值:[-2^31,2^31-1]
int6464位长度的整数,取值:[-2^63,2^63-1]

还有一类元素类型,没有负数部分,称为无符号整数:

数据类型说明
uint88位无符号整数,取值:[0,255]
uint1616位无符号整数,取值:[0,65535]
uint3232位无符号整数,取值:[0,2^32-1]
uint6464位无符号整数,取值:[0,2^64-1]
float1616位半精度浮点数:1位符号位,5位指数,10位尾数
float3232位半精度浮点数:1位符号位,8位指数,23位尾数
float6464位半精度浮点数:1位符号位,11位指数,52位尾数
float128扩展精度的浮点数

ndarray还支持两种复数类型:

数据类型说明
complex64复数类型,实部和虚部都是32位浮点数
complex128复数类型,实部和虚部都是64位浮点数

相比python语法仅支持整数、浮点数和复数3种类型,那ndarray为什么要支持这么多的元素类型那?

  • 科学计算涉及数据较多,对存储和性能都有较高要求;
  • 对元素类型精细定义,有助于Numpy合理使用存储空间并优化性能;
  • 对元素类型精细定义,有助于程序员对程序规模有合理评估。

7.数据类型转换

可以使用ndarray的astype方法将一个数组从一种数据类型显式地转换为另一种。

TIPS:调用astype总是创建一个新的数组(数据的拷贝),即使新的数据类型与旧的数据类型相同。

arr = np.array([[0,1,2,3,4],[9,8,7,6,5]])

arr.dtype
# dtype('int32')

float_arr = arr.astype(np.float64)

float_arr.dtype
# dtype('float64')

需要注意是,如果将浮点数转换为整数的话,那么原有数据小数点后的部分将会被消除。

arr = np.array([1.23 , -2.34 , 3.45 , -4.56 , 5.67])
arr
# array([ 1.23, -2.34,  3.45, -4.56,  5.67])

int_arr = arr.astype(np.int64)
int_arr 
# array([ 1, -2,  3, -4,  5], dtype=int64)

也可以使用astype将一个代表数字的字符串数组转换为数字形式。

num_str_arr = np.array(['1.23' , '-2.34' , '3.45' , '-4.56' , '5.67'] ,  dtype=np.string_)
num_str_arr
# array([b'1.23', b'-2.34', b'3.45', b'-4.56', b'5.67'], dtype='|S5')

num_arr = num_str_arr.astype(np.float64)
num_arr
# array([ 1.23, -2.34,  3.45, -4.56,  5.67])
num_arr.dtype
# dtype('float64')

TIPS:在使用numpy.string_类型时要谨慎,因为NumPy中的字符串数据是固定大小的,可能会在没有警告的情况下截断输入。 pandas对非数字数据有更直观的开箱即用操作。

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments