Numpy的介绍

numpy是一个开源的python科学计算库,用于快速处理任意维度的数组。

Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务。使用Numpy比直接使用python要快的多。

Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器

ndarray对象

Numpy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合

语文数学英语
808560
759555

上面的表格就可以用ndarray进行存储

import numpy as np
# 创建
score = np.array(
    [[80,85,60],
     [75,95,55]])
type(score)   >>>   numpy.ndarray

numpy的优势

numpy的内存风格

numpy到底跟原生python列表有不同参考下图:

可以看出在numpy的内存规则中必须保证数据类型一致,而python列表则可以使用不同类型的数据。

从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。

这是因为ndarray中的所有元素的类型都是相同的,而Python列表汇总的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方法找到下一个元素,这虽然也导致了在通用性能方面numpy的ndarray不及python原生list,但在科学计算汇总,numpy的ndarray就可以省去很多循环语句,代码使用方面比python原生list的效率强很多。

ndarray支持并行化运算(向量化运算)

numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算

效率远高于纯python代码

numpy底层使用C语言编写,内部接触了GIL(全局解释器锁),其对数组的操作速度不受python解释器的限制,所以其效率远高于python。

ndarray对象介绍

ndarray的常见属性及方法

属性名字属性解释
ndarray.shape数组维度的元组,也叫形状
ndarray.ndim数组维数
ndarray.size数组中的元素数量
ndarry.itemsize一个数组元素的长度(字节)
ndarray.dtype数组元素的类型

用法测试

score = np.array(
    [[80,85,60,78],
     [75,95,55,96],
     [75,95,55,88],
     [85,95,55,79],
     [75,95,85,63],
     [75,85,55,100]])
print("数组形状:{}\n
       数组维度:{}\n
       数组元素个数:{}\n
       数组中数据类型:{}\n
       一个数组元素的长度:{}".format(score.shape,score.ndim,score.size,score.dtype,score.itemsize))

>>>
数组形状:(6, 4)
数组维度:2
数组元素个数:24
数组中数据类型:int32
一个数组元素的长度:4

ndarray的形状(shape)

ndarray.shape输出的是 (行,列)

a = np.array([1,2,3,4]) #一维
b = np.array([[1,2,3],
              [4,5,6]])  #二维
c = np.array([
              [[1,2,3],
               [4,5,6]],
    
              [[7,8,9],
               [10,11,12]]
             ])  #三维

print(a.shape,b.shape,c.shape)
print(a.ndim,b.ndim,c.ndim)

>>>
(4,) (2, 3) (2, 2, 3)
1 2 3

如何更加直观的理解维数和形状?

  • 二维数组:
    类似于一张二维表,有行有列
  • 三维数组:
    相当于对二维表进行叠加,最外围的 (0,1,2)分别代表序号为0,1,2的二维数组

ndarray的数据类型

>>> type(score.dtype)
<type 'numpy.dtype'>

dtype是numpy.dtype类型,先看看对于数组来说都有哪些类型

arr = np.array(['python','java','ccc'],dtype=np.string_)
arr2 = np.array([1,2,3,4],dtype=np.int64)
arr2.dtype
>>>
dtype('int64')

所念皆星河