目录
前言:
本文包含numpy基本知识,了解包内一些简单函数,如:numpy.array()函数;numpy.arange()函数; lnumpy.inspace()函数;reshape()函数;ndim()函数;numpy.append()函数。
安装numpy包:
1. 有大佬的安装教程如下:
(如果创建了多个python项目,就需要多次下载numpy,一个项目带一个numpy;
解释器不是插件。)
这个方法较为简单,在文件——>设置——>项目,找到python解释器。
(另:如果想要引入pandas包,项目解释器中必须有numpy,否则尝试任何方法都无法安装。(本人亲测,如果哪位大佬走过路过看了本文,并在没有numpy解释器的情况下引入了pandas包,请不吝赐教。)个人认为,这是由于pandas基于numpy。)
numpy中创建数组的函数:
np.array():
import numpy as np
c = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[3, 5, 6, 0],
[8, 9, 5, 6]])
我们使用
np.array()
函数创建了一个二维数组。由于这个函数是numpy的,所以在调用的时候要写:np.array()。
测试该函数的数据类型,使用type()函数:
print(type(c))
# <class 'numpy.ndarray'>
于是我们调用成功,得到了一个
numpy.ndarray
类型
的数组。
注意:ndarray是数据类型,不是函数!!!
我们还可以再举一个例子,比较两者的区别。创建一个没有调用np.array()函数的二维数组,并输出其数据类型:
ccc = [[1, 2, 3, 4], [5, 6, 7, 8], [3, 5, 6, 0], [8, 9, 5, 6]]
print(type(ccc))
# <class 'list'>
输出的结果为列表。
问:为什么我要费劲的去调用numpy的函数,创建一个看起来没什么区别的ndarray类型数组,而不能直接用数组呢?
我最初也有这个问题,在逐渐学习中,我领略了numpy的强大。
np.array()中还有一个参数可以调用——dtype=; 即可以改变输入数组的数据类型。比如,输入的数组(此时类型还是List)里面装的是int,可以用dtype转为str。
但是注意!
即便数组内部的int转化为了str,其数据类型依然是numpy.ndarray
。
a = np.array([1], dtype=str)
print(a)
# 输出 ['1']
print(type(a))
# 输出 <class 'numpy.ndarray'>
np.arange():
如果说np.array()是将输入的数组转化为np.ndarray类型,那么np.arange()则是简便快捷创建
一维
数组的不二选择。
该函数内部有三个参数:start, end, step,表示的是从start开始,到end结束(结果
不包含
end),每间隔step,输出一个数字。
a = np.arange(0, 60, 5)
print(a)
# 输出: [ 0 5 10 15 20 25 30 35 40 45 50 55]
其数据类型依然是np.ndarray。
如果我在参数内只输入一个数,依然是可行的。默认start为0,step为1。(和range()函数有相似之处)
pr = np.arange(10)
print("pr.arange(10):", pr)
# pr.arange(10): [0 1 2 3 4 5 6 7 8 9]
注意
:np.arange()中的参数,要么只写一个end,要么三个数全写,不可以只写end和step,而不写start,否则会赋值空数组。
np.linspace():
该函数的主要参数也有3个,分别是:start, end, step,该函数是从start开始,到end结束(
包含
end!),一共输出
step个
数字,返回一个np.ndarray类型的数组。(比如下面的例子,step=8,表示一共有8个数字,千万别和切片里面用到的step弄混了)
不过,np.linspace()除了这三个重要参数外,还有两个隐藏参数(我起的名,专指呢些可写可不写的参数):endpoint 和 retstep,
不写
这两个参数的时候,
endpoint=True,retstep=False
。
先说endpoint:
endpoint
默认
为True,表示
包尾
。如果不想包尾怎么办?endpoint=False就不包了。
s1 = np.linspace(10, 50, 8, endpoint=False)
print(s1)
# [10. 15. 20. 25. 30. 35. 40. 45.]
s2 = np.linspace(10, 50, 8, endpoint=True)
print(s2)
# [10. 15.71428571 21.42857143 27.14285714 32.85714286 38.57142857
44.28571429 50. ]
retstep:
restep默认等于False,该参数为True时,显示np.ndarray数组的公差。
调用numpy中的其他常用函数:
reshape():
该函数基于np.ndarray数组进行修改,函数内部参数为目标数组的
行
和
列
a = np.arange(0, 60, 5)
a1 = a.reshape(4, 3)
# 将a转化为4行3列的二维数组
reshape属于numpy的函数,但调用的前面需要写a,而不是np。
所以,也可以有以下的简便写法:
a = np.arange(0, 60, 5).reshape(4, 3)
ndim():
该函数主要是用来查看np.ndarray数组的维数,比较简单,基于数组,所以调用方法和reshape()相同。
c = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[3, 5, 6, 0],
[8, 9, 5, 6]])
print("c.ndim=", c.ndim)
# c.ndim= 2
np.append():
这个函数名称真的很眼熟,作用也和列表中的append()相似,但依然有不同。
1. 创建一个二维数组,使用np.append(),以一维列表作为参数传入函数中。
a = np.arange(0, 60, 5).reshape(4, 3)
"""这是我们之前创造的数组, 输出结果如下"""
# [[ 0 5 10]
# [15 20 25]
# [30 35 40]
# [45 50 55]]
aa = np.append(a, [11, 22, 33])
print(aa)
# [ 0 5 10 15 20 25 30 35 40 45 50 55 11 22 33]
问题:输出结果由一个二维数组,转化成了一维数组。即便是将添加的一维数组转化为二维数组,输出的依然是一维数组。此时可以随意添加,无需在意原数组的列数。
2. 依然使用原二维数组,在np.append() 函数中加入参数 axis=0
bb = np.append(a, [[11, 22, 33]], axis=0)
print(bb)
# 应该注意到,添加的数组变成了二维数组,附在ndarray后面
添加的数组作为新的一行附着在数组最后。
原数组为4行3列,即一行有3个数字,如果当axis=0时,其列数必须和原数组相同。如果随意修改,就会报错。
因此,axis=0时,相当于固定列数,添加行数。
3.
依然使用原二维数组,在np.append() 函数中加入参数 axis=1
cc = np.append(a, [[11, 22, 33], [44, 55, 66], [45, 56, 67], [33, 44, 88]], axis=1)
print(cc)
# [[ 0 5 10 11 22 33]
# [15 20 25 44 55 66]
# [30 35 40 45 56 67]
# [45 50 55 33 44 88]]
不难看出,添加的数组被依次附着在每一行的后面,如果添加的数组行数大于原数组的行数,就会报错。
因此,axis=0时,相当于固定行数,添加列数。
日拱一卒,功不唐捐。