- 理论知识
- Numpy介绍
- 1 Numpy比python数组好在哪
- 2 NumPy 大多数需要快速计算的部分都是用 C 或 C ++ 编写的。
- 3 NumPy 的源代码位于这个 github 资料库中:https://github.com/numpy/numpy
- Numpy引入
- Numpy和Python Array(数组)之间重要区别
- 代码操作
- 1.创建ndarry对象
NumPy 数值 Python(Numerical Python)是用于处理数组的 python 库。 由 Travis Oliphant 于 2005 年创建。
1 Numpy比python数组好在哪在 Python 中,我们有满足数组功能的列表,但是处理起来很慢。NumPy 旨在提供一个比传统 Python 列表快 50 倍的数组对象。NumPy 中的数组对象称为 ndarray,它提供了许多支持函数,使得利用 ndarray 非常容易。
NumPy 比列表更快的主要原因:
**储存方式:**NumPy 数组存储在内存中的一个连续位置,因此进程可以非常有效地访问和操纵它们。这种行为在计算机科学中称为引用的局部性。它还经过了优化,可与最新的 CPU 体系结构一同使用。
矢量化:矢量化描述了代码中没有任何显示的循环,索引等。这当然是预编译的C代码幕后优化的结果。
广播:描述操作的隐式逐元素行为的术语。一般来说,在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='输入为整型
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='二维数组的维数不同
ar4 = np.array([[1,2,3],('a','b','c','d')]) ar4输出:
array([list([1, 2, 3]), ('a', 'b', 'c', 'd')], dtype=object)会有提醒:
C:Users14036AppDataLocalTemp/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参数,默认为Turea = 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))输出:
at,subok为True: af,subok为False: 1894294309568 1894294252688 1.6.对于order
order参数指定阵列的内存布局。当对象不是数组时, 除非指定” F”, 否则新创建的数组将以C顺序(行头或行主)出现。当指定F时, 它将按Fortran顺序(列标题或列主)。当对象是数组时, 它保持以下顺序。
默认为“K”
可以参考:
深入理解numpy库中的order参数



