学习Numpy(一)

理论知识

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参数

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值