目录
理论知识
Numpy介绍
NumPy 数值 Python(Numerical Python)是用于处理数组的 python 库。 由 Travis Oliphant 于 2005 年创建。
1 Numpy比python数组好在哪
在 Python 中,我们有满足数组功能的列表,但是处理起来很慢。NumPy 旨在提供一个比传统 Python 列表快 50 倍的数组对象。NumPy 中的数组对象称为 ndarray,它提供了许多支持函数,使得利用 ndarray 非常容易。
NumPy 比列表更快的主要原因:
**储存方式:**NumPy 数组存储在内存中的一个连续位置,因此进程可以非常有效地访问和操纵它们。这种行为在计算机科学中称为引用的局部性。它还经过了优化,可与最新的 CPU 体系结构一同使用。
矢量化:矢量化描述了代码中没有任何显示的循环,索引等。这当然是预编译的C代码幕后优化的结果。
广播:描述操作的隐式逐元素行为的术语。一般来说,在Numpy中,所有操作,不仅仅是算术运算,而是逻辑,位,功能等,都以这种隐式的逐元素方式表现,即它们进行广播。
2 NumPy 大多数需要快速计算的部分都是用 C 或 C ++ 编写的。
3 NumPy 的源代码位于这个 github 资料库中:https://github.com/numpy/numpy
Numpy引入
NumPy 通常以 np 别名导入。
import numpy as np
查看版本
print(np.__version__)
**Numpy提供多维数组对象,**各种派生对象(如掩码数组和矩阵),以及用于各种数组快速操作的API,包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅里叶变换、基本线性代数、基本统计运算和随机模拟等。
Numpy包的核心是ndarray对象。它封装了python原生的同数据类型的n维数组。
ndarray 即n-dimension-array 的简写。
创建一个 ndarray 只需调用 NumPy 的 array 函数即可(后面会再说):
import numpy as np
a = np.array([[0,1,2],[3,4,5],[6,7,8]])
print(a)
type(a)
为了保证其性能优良,其中有许多操作都是代码在本地进行编译的。
Numpy和Python Array(数组)之间重要区别
1.Numpy数组在创建时具有固定的大小,与Python的原生数组对象(可以动态增长:使用pop(),insert(),append(),remove(),clear()函数操作)不同。更改ndarry的大小将创建一个新数组并删除原来的数组。
2.Numpy在数组中的元素都需要具有相同的数据类型,因此在内存中大小相同。 例外:Python的原生数组里包含了Numpy对象的时候,这种情况下就允许不同大小元素的数组。
3.Numpy数组有助于对大量数据进行高级数学和其他类型的计算。通常,这些操作的执行效率更高,比使用Python原生数组的代码更少。
4.越来越多的基于Python的科学和数学软件使用Numpy数组,虽然这些工具通常都支持Python的原生数组作为参数,但它们在处理之前还是会将输入的数组转换为Numpy的数组,而且也通常输出Numpy数组。
代码操作
1.创建ndarry对象
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
实例:
array()函数,括号内可以是列表、元组、数组、迭代器,生成器等
1.1对于object
#列表
np.array([1,2,3,4,5])
type(np.array([1,2,3,4,5]))
输出:
numpy.ndarray
#元组
np.array((1,2,3,4,5))
输出:
array([1, 2, 3, 4, 5])
#迭代对象
np.array(range(10))
输出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.array([i**2 for i in range(10)])
输出:
array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81])
#创建10以内的偶数的数组
np.array([i for i in range(10) if i%2 == 0])
输出:
array([0, 2, 4, 6, 8])
1.2 对于dtype
#列表中元素类型不相同
np.array([1,1.5,3,4.5,'5'])
结果全部改成字符串类型
输出:
array(['1', '1.5', '3', '4.5', '5'], dtype='<U32')
输入为整型
ar1 = np.array(range(10))
ar1
输出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
输入为浮点型
ar2 = np.array([1,2,3.14,4,5])
ar2
输出:
array([1. , 2. , 3.14, 4. , 5. ])
输入为二维数组:嵌套序列(列表,元组均可)
ar3 = np.array([[1,2,3],('a','b','c')])
ar3
输出:
array([['1', '2', '3'],
['a', 'b', 'c']], dtype='<U11')
二维数组的维数不同
ar4 = np.array([[1,2,3],('a','b','c','d')])
ar4
输出:
array([list([1, 2, 3]), ('a', 'b', 'c', 'd')], dtype=object)
会有提醒:
C:\Users\14036\AppData\Local\Temp/ipykernel_19096/189647353.py:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
ar4 = np.array([[1,2,3],('a','b','c','d')])
ar4.shape
输出:两行一列,强制转化为1维
(2,)
设置数组元素类型
has_dtype_a = np.array([1,2,3,4,5],dtype='float')
has_dtype_a
输出:
array([1., 2., 3., 4., 5.])
1.3.对于copy
设置copy参数,默认为Ture
a = np.array([1,2,3,4,5])
b = np.array(a)
print('a:', id(a), ' b:',id(b))
print('以上可以看出a和b的内存地址')
输出:
a: 1894294250768 b: 1894294252208
以上可以看出a和b的内存地址
不使用ndarray,将a的值赋给b相当于列表的引用赋值
a = np.array([1,2,3,4,5])
b = a #相当于列表的引用赋值
print('a:', id(a), ' b:',id(b))
print('以上可以看出a和b的内存地址')
a: 1894294252592 b: 1894294252592
以上可以看出a和b的内存地址
1.4.对于ndmin
ndmin指定数组的维度
a = np.array([1,2,3])
print(a)
a = np.array([1,2,3],ndmin=2)
print(a)
输出:
a由一维数组变为2维数组
[1 2 3]
[[1, 2, 3]]
1.5.对于subok
subok参数,类型为bool值,默认为False.
若为True,使用object的内部数据类型;若为False:使用数组的数据类型
例子:
a = np.mat([1,2,3,4]) #创建一个矩阵
print(type(a))
#既要复制一份副本,又要保持原类型
at = np.array(a,subok=True)
af = np.array(a)
print('at,subok为True:',type(at))
print('af,subok为False:',type(af))
print(id(at),id(af))
输出:
<class 'numpy.matrix'>
at,subok为True: <class 'numpy.matrix'>
af,subok为False: <class 'numpy.ndarray'>
1894294309568 1894294252688
1.6.对于order
order参数指定阵列的内存布局。当对象不是数组时, 除非指定” F”, 否则新创建的数组将以C顺序(行头或行主)出现。当指定F时, 它将按Fortran顺序(列标题或列主)。当对象是数组时, 它保持以下顺序。
默认为“K”
可以参考:
深入理解numpy库中的order参数