下载anaconda之前需要把python卸载
可以找到
卸载和安装的步骤一样,双击
如果你找不到,可以去官网下载安装的python对应的版本,
如果不知道安装的python版本是什么可以在,win+r输入cmd回车,执行
python --version
然后去官网下载相应的包,进行卸载
不要打勾
安装完成后,最重要一步,环境变量设置
此电脑——属性——高级系统设置——环境变量——path——编辑——新建
绿色为自己的目录,不要照抄
E:\tool\anaconda\Miniconda3(Python需要)
E:\tool\anaconda\Miniconda3\Scripts(conda自带脚本)
E:\tool\anaconda\Miniconda3\Library\bin(jupyter notebook动态库)
执行两个命令
python --version
jupyter notebook
导入bao
import numpy as np
原生python实现代码
def python_sum(n):
'''
原生python实现2个数组的加法
'''
# 使用列表生成式创建1到N的平方
a = [i**2 for i in range(n)]
# 使用列表生成式创建1到N的立方
b = [i**3 for i in range(n)]
# 新创建新列表
ab_sum = []
# 循环a的索引
for i in range(n):
# 将a中的对应元素与b中对应的元素相加
ab_sum.append(a[i]+b[i])
return ab_sum
#################################
# 调用实现函数
python_sum(10)
################################
[0, 2, 12, 36, 80, 150, 252, 392, 576, 810]
numpy 实现代码
def numpy_sum(n):
'''
numpy实现2个数组的加法
'''
a = np.arange(n) ** 2
b = np.arange(n) ** 3
print(a)
print(b)
return a + b
##############################
# 调用numpy实现函数
numpy_sum(10)
#############################
[ 0 1 4 9 16 25 36 49 64 81]
[ 0 1 8 27 64 125 216 343 512 729]
array([ 0, 2, 12, 36, 80, 150, 252, 392, 576, 810], dtype=int32)
通过 NumPy 的内置函数 array() 可以创建 ndarray 对象,其语法格式如下:
numpy.array(object, dtype = None, copy = True, order = None,subok=False,ndmin = 0)
参数说明
序号 | 参数 | 描述说明 |
---|---|---|
1 | object | 表示一个数组序列。 |
2 | dtype | 可选参数,通过它可以更改数组的数据类型。 |
3 | copy | 可选参数,表示数组能否被复制,默认是 True。 |
4 | ndmin | 用于指定数组的维度。 |
5 | subok | 可选参数,类型为bool值,默认False。为True,使用object的内部数据类型;False:使用object数组的数据类型。 |
array()函数,括号内可以是列表、元祖、数组、迭代对象,生成器等
np.array([1,2,3,4,5])
#输出: array([1, 2, 3, 4, 5])
# 迭代对象
np.array(range(10))
# 生成器
np.array([i**2 for i in range(10)])
# 列表中元素类型不相同
np.array([1,1.5,3,4.5,'5'])
#输出: array(['1', '1.5', '3', '4.5', '5'], dtype='
#浮点型
ar2 = np.array([1,2,3.14,4,5])
输出: array([1. , 2. , 3.14, 4. , 5. ])
a = np.array([1,2,3])
print(a)
a = np.array([1,2,3], ndmin=2)
a
输出:[1 2 3]
array([[[1, 2, 3]]])
#定义个数组
a = np.array([2,4,3,1])
# 在定义b时,如果想复制a的几种方案:
1.使用np.array()
b = np.array(a)
print('b = np.array(a):',id(b),id(a))
#输出
b = np.array(a): 2066731363744 2066731901216
2.使用数组的copy()方法
c = a.copy()
print('c = a.copy():',id(c),id(a))
#输出
c = a.copy(): 2066732267520 2066731901216
直接使用=号复制
直接使用=号,会使2个变量指向相同的内存地址,修改d也会相应的修改a
d = a
print('d = a:',id(d),id(a))
#输出
d = a: 2066731901216 2066731901216
根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 ndarray。
numpy.arange(start, stop, step, dtype)
参数说明
序号 | 参数 | 描述说明 |
---|---|---|
1 | start | 起始值,默认为0 |
2 | stop | 终止值(不包含) |
3 | step | 步长,默认为1 |
4 | dtype | 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。 |
整型
np.arange(10)
# np.array(range(10))
#输出
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
浮点型
# 可以使用浮点型数值
np.arange(3.1)
#输出
array([0., 1., 2., 3.])
指定类型
# 返回浮点型的,也可以指定类型
x = np.arange(5, dtype = float)
x
#输出
array([0., 1., 2., 3., 4.])
指定开始位置和步长
# 起始10 ,终止值20 步长2
np.arange(10,20,2)
#输出
array([10, 12, 14, 16, 18])
指定参数
ar3 = np.arange(20,step=3)
print(ar3)
#输出
[ 0 3 6 9 12 15 18]
float 不精确影响numpy.arange
返回在间隔[开始,停止]上计算的num个均匀间隔的样本。数组是一个等差数列构成
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数说明
序号 | 参数 | 描述说明 |
---|---|---|
1 | start | 必填项,序列的起始值, |
2 | stop | 必填项,序列的终止值,如果endpoint为true,该值包含于数列中 |
3 | num | 要生成的等步长的样本数量,默认为50 |
4 | endpoint | 该值为 true 时,数列中包含stop值,反之不包含,默认是True。 |
5 | retstep | 如果为 True 时,生成的数组中会显示间距,反之不显示。 |
6 | dtype | ndarray 的数据类型 |
# 以下实例用到三个参数,设置起始点为 1 ,终止点为 10,数列个数为 10。
a = np.linspace(1,10,10)
a
#输出
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
a = np.linspace(1,10,endpoint=False)
a
#输出 默认均分50等份
array([1. , 1.18, 1.36, 1.54, 1.72, 1.9 , 2.08, 2.26, 2.44, 2.62, 2.8 ,
2.98, 3.16, 3.34, 3.52, 3.7 , 3.88, 4.06, 4.24, 4.42, 4.6 , 4.78,
4.96, 5.14, 5.32, 5.5 , 5.68, 5.86, 6.04, 6.22, 6.4 , 6.58, 6.76,
6.94, 7.12, 7.3 , 7.48, 7.66, 7.84, 8.02, 8.2 , 8.38, 8.56, 8.74,
8.92, 9.1 , 9.28, 9.46, 9.64, 9.82])
# 一下实例用到三个参数,设置起始位置为2.0,终点为3,0 数列个数为5
ar1 = np.linspace(2.0, 3.0, num=5)
ar1
#输出
array([2. , 2.25, 2.5 , 2.75, 3. ])
#设置retstep显示计算后的步长
ar1 = np.linspace(2.0,3.0,num=5, retstep=True)
print(ar1)
#输出
(array([2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)
返回在间隔[开始,停止]上计算的num个均匀间隔的样本。数组是一个等比数列构成
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
参数说明
序号 | 参数 | 描述说明 |
---|---|---|
1 | start | 必填项,序列的起始值, |
2 | stop | 必填项,序列的终止值,如果endpoint为true,该值包含于数列中 |
3 | num | 要生成的等步长的样本数量,默认为50 |
4 | endpoint | 该值为 true 时,数列中包含stop值,反之不包含,默认是True。 |
5 | base | 对数 log 的底数 |
6 | dtype | ndarray 的数据类型 |
整数
a = np.logspace(0,9,10,base=2)
a
#输出
array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])
np.logspace(A,B,C,base=D)
浮点数
# 取得1到2之间10个常用对数
np.logspace(1.0,2.0,num=10)
NumPy 的数组中比较重要 ndarray 对象属性有:
属性 | 说明 |
---|---|
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
ndarray.size | 数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray.dtype | ndarray 对象的元素类型 |
ndarray.itemsize | ndarray 对象中每个元素的大小,以字节为单位 |
调整维度 reshape
返回调整维度后的副本,而不改变原 ndarray。
reshape 调整维度
a = np.array([1,2,3,4,5, 6])
print('一维数组a:',a.shape)
# 使用a数组,创建一个新的数组b,并向形状修改为2行3列
b = a.reshape((2,3))
print('b的形状:',b.shape)
print('b:', b)
#输出
一维数组a: (6,)
b的形状: (2, 3)
b: [[1 2 3]
[4 5 6]]
调整维度 resize
numpy.resize(a, new_shape) 如果新数组大于原始数组,则新数组将填充a的重复副本。
请注意,此行为与a.resize(new_shape)不同,后者用零而不是重复的a填充。
# a 为2行2列
a=np.array([
[0,1],
[2,3]
])
# 一a为原数组创建2行3列的新数组
b_2_3 = np.resize(a,(2,10))
b_2_3
#输出
array([[0, 1, 2, 3, 0, 1, 2, 3, 0, 1],
[2, 3, 0, 1, 2, 3, 0, 1, 2, 3]])
ndarray.ndim
返回数组的维度(秩):轴的数量,或者维度的数量,是一个标量,一维数组的秩为 1,二维数组的秩为 2
a = np.array([1,2,3,4,5, 6])
b = a.reshape((2,3))
c = np.array([
[
[1, 2, 3],
[4, 5, 6]
],
[
[11, 22, 33],
[44, 55, 66]
]
])
print('a的ndim:',a.ndim)
print('b的ndim:', b.ndim)
print('c的ndim:', c.ndim)
#输出
a的ndim: 1
b的ndim: 2
c的ndim: 3
ndarray.size
数组元素的总个数,相当于 .shape 中 n*m 的值
a = np.array([1,2,3,4,5,6])
print('[1,2,3,4,5,6]的size:', a.size)
a = np.array([[1,2,3],[4,5,6]])
print('[[1,2,3],[4,5,6]]的size:', a.size)
#输出
[1,2,3,4,5,6]的size: 6
[[1,2,3],[4,5,6]]的size: 6
ndarray.dtype
ndarray 对象的元素类型
a = np.array([1,2,3,4,5,6])
print(a.dtype)
b = np.array([1.1,2,3,4,5,6])
print(b.dtype)
#输出
int32
float64
方法astype()
numpy数据类型转换,调用astype返回数据类型修改后的数据,但是源数据的类型不会变
a=np.array([1.1, 1.2])
print('a数据类型:',a.dtype) #
print('astype修改数据类型:',a.astype('float32').dtype)
print('原数据类型未改变',a.dtype)
# 正确操作
a = a.astype('float32')
print('修改类型后再次操作,类型改变:',a.dtype)
#输出
a数据类型: float64
astype修改数据类型: float32
原数据类型未改变 float64
修改类型后再次操作,类型改变: float32
ndarray.itemsize
以字节的形式返回数组中每一个元素的大小。
例如,一个元素类型为 float64 的数组 itemsize 属性值为 8(float64 占用 64 个 bits,每个字节长度为 8,所以 64/8,占用 8 个字节)
a = np.array([1.1,2.2,3.3])
print('dtype:',a.dtype,' itemsize:',a.itemsize)
b = np.array([1,2,3,4,5])
print('dtype:',b.dtype,' itemsize:',b.itemsize)
#输出
dtype: float64 itemsize: 8
dtype: int32 itemsize: 4
名称 | 描述 | 名称 | 描述 |
---|---|---|---|
bool_ | 布尔型数据类型(True 或者 False) | float_ | float64 类型的简写 |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) | float16/32/64 | 半精度浮点数:1 个符号位,5 个指数位,10个尾数位 单精度浮点数:1 个符号位,8 个指数位,23个尾数位 双精度浮点数,包括:1 个符号位,11 个指数位,52个尾数位 |
intc | 和 C 语言的 int 类型一样,一般是 int32 或 int 64 | complex_ | 复数类型,与 complex128 类型相同 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,通常为 int32 或 int64) | complex64/128 | 复数,表示双 32 位浮点数(实数部分和虚数部分) 复数,表示双 64 位浮点数(实数部分和虚数部分) |
int8/16/32/64 | 代表与1字节相同的8位整数 代表与2字节相同的16位整数 代表与4字节相同的32位整数 代表与8字节相同的64位整数 |
str_ | 表示字符串类型 |
uint8/16/32/64 | 代表1字节(8位)无符号整数 代表与2字节相同的16位整数 代表与4字节相同的32位整数 代表与8字节相同的64位整数 |
string_ | 表示字节串类型,也就是bytes类型 |
# 将数组中的类型存储为浮点型
a = np.array([1,2,3,4],dtype=np.float64)
a
#输出
array([1., 2., 3., 4.])
# 将数组中的类型存储为布尔类型
a = np.array([0,1,2,3,4],dtype=np.bool_)
print(a)
a = np.array([0,1,2,3,4],dtype=np.float_)
print(a)
#输出
[False True True True True]
[0. 1. 2. 3. 4.]
# str_和string_区别
str1 = np.array([1,2,3,4,5,6],dtype=np.str_)
string1 = np.array([1,2,3,4,5,6],dtype=np.string_)
str2 = np.array(['我们',2,3,4,5,6],dtype=np.str_)
print(str1,str1.dtype)
print(string1,string1.dtype)
print(str2,str2.dtype)
#输出
['1' '2' '3' '4' '5' '6'] <U1
[b'1' b'2' b'3' b'4' b'5' b'6'] |S1
['我们' '2' '3' '4' '5' '6'] <U2
使用数据类型标识码
字符 | 对应类型 | 字符 | 对应类型 | 字符 | 对应类型 | 字符 | 对应类型 |
---|---|---|---|---|---|---|---|
b | 代表布尔型 | i | 带符号整型 | u | 无符号整型 | f | 浮点型 |
c | 复数浮点型 | m | 时间间隔(timedelta) | M | datatime(日期时间) | O | Python对象 |
S,a | 字节串(S)与字符串(a) | U | Unicode | V | 原始数据(void) |
还可以将两个字符作为参数传给数据类型的构造函数。此时,第一个字符表示数据类型,
第二个字符表示该类型在内存中占用的字节数(2、4、8分别代表精度为16、32、64位的
浮点数):
import numpy as np
teacher = np.dtype([('name',np.str_,2), ('age', 'i1'), ('salary', 'f4')])
#输出结构化数据teacher
print(teacher)
#将其应用于ndarray对象
b = np.array([('wl', 32, 8357.50),('lh', 28, 7856.80)], dtype = teacher)
print(b)
print(b['name'])
#输出
[('name', '), ('age', 'i1'), ('salary', ')]
[('wl', 32, 8357.5) ('lh', 28, 7856.8)]
['wl' 'lh']
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引
区别在于:数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改)。
这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本(.copy())。
冒号分隔切片参数 [start:stop:step]
一维切片
ar1 = np.arange(10)
# 从索引 2 开始到索引 7 停止,间隔为 2
ar2 = ar1[2:7:2]
print(ar2)
print(ar1)
#输出
[2 4 6]
[0 1 2 3 4 5 6 7 8 9]
冒号 : 的解释:如果只放置一个参数,
ar3 = np.arange(1,20,2)
#array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19])
print(ar3[:-2])
#[ 1 3 5 7 9 11 13 15]
ar3[::-1]
#array([19, 17, 15, 13, 11, 9, 7, 5, 3, 1])
为什么切片和区间会忽略最后一个元素
计算机科学家edsger w.dijkstra(艾兹格·W·迪科斯彻),delattr这一风格的解释应该是比较好的:
二维切片
ar4_5 = np.arange(20).reshape(4,5)
print(ar4_5)
#输出
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
# 切片为下一维度的一个元素,所以是一维数组
ar4_5[2]
#输出
array([10, 11, 12, 13, 14])
# 二次索引取得,一维数组中的元素
print(ar4_5[2][2])
#输出
12
ar4_5[2:]
#array([[10, 11, 12, 13, 14],
# [15, 16, 17, 18, 19]])
s = ar4_5[:][0]
#[0 1 2 3 4]
注意:切片还可以使用省略号“…”,如果在行位置使用省略号,那么返回值将包含所有行元素,反之,则包含所有列元素。
需要取得第二列数据
ar4_5[...,1]
# array([ 1, 6, 11, 16])
返回第二列后的所有项
ar4_5[...,1:]
array([[ 1, 2, 3, 4],
[ 6, 7, 8, 9],
[11, 12, 13, 14],
[16, 17, 18, 19]])
返回2行3列数据
print(ar4_5[1,2]) # 对应(1,2) 的元素
print(ar4_5[1:,2:])
7
[[ 7 8 9]
[12 13 14]
[17 18 19]]
在 NumPy 中还可以使用高级索引方式,比如整数数组索引、布尔索引,以下将对两种种索引方式做详细介绍。