点击蓝字关注我,有干货领取!html
一、什么是numpy?
一言以蔽之,numpy是python中基于数组对象的科学计算库。python
提炼关键字,能够得出numpy如下三大特色:web
-
拥有n维数组对象; -
拥有广播功能(后面讲到); -
拥有各类科学计算API,任你调用;

二、如何安装numpy?
由于numpy是一个python库,因此使用python包管理工具pip或者conda均可以安装。数据库
安装python后,打开cmd命令行,输入:数组
pip install numpy
便可完成安装。微信
三、什么是n维数组对象?
n维数组(ndarray)对象,是一系列同类数据的集合,能够进行索引、切片、迭代操做。app
numpy中可使用array
函数建立数组:dom
import numpy as np
np.array([1,2,3])
# 输出:array([1, 2, 3])
四、如何区分一维、二维、多维?
判断一个数组是几维,主要是看它有几个轴(axis)。编辑器
一个轴表示一维数组,两个轴表示二维数组,以此类推。函数
每一个轴都表明一个一维数组。
好比说,二维数组第一个轴里的每一个元素都是一个一维数组,也就是第二个轴。
一维数组一个轴:
[1,2,3]
二维数组两个轴:
[[0, 1, 2],
[3, 4, 5]]
三维数组三个轴:
[[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]]
以此类推n维数组。
五、如何建立n维数组?
numpy中经常使用array
函数建立数组,传入列表或元组便可。
建立一维数组,并指定数组类型为int
:
import numpy as np
np.array([1,2,3],dtype=int)
# 输出:array([1, 2, 3])
建立二维数组:
import numpy as np
np.array(((1,2),(3,4)))
'''
输出:
array([[1, 2],
[3, 4]])
'''
还可使用arange
函数建立一维数字数组,用法相似python的range
函数.
import numpy as np
np.arange(1,6)
'''
输出:array([1, 2, 3, 4, 5])
'''
六、如何建立随机数组?
numpy的random
模块用来建立随机数组。
-
random.rand
函数,生成[0,1)均匀分布的随机数组
import numpy as np
# 建立2行2列取值范围为[0,1)的数组
np.random.rand(2,2)
'''
输出:
array([[0.99449146, 0.92339551],
[0.1837405 , 0.41719798]])
'''
-
random.randn
函数,生成数值成标准正态分布(平均值为0,标准差为1)的数组
import numpy as np
# 建立2行3列,取值范围为标准正态分布的数组
np.random.randn(3,2)
'''
输出:
array([[-1.27481003, -1.5888111 ],
[ 0.16985203, -2.91526479],
[ 1.75992671, -2.81304831]])
'''
-
random.randint
函数,生成能够指定范围的随机整数数组
import numpy as np
# 建立2行2列,取值范围为[2,10)的随机整数数组
np.random.randint(2,10,size=(2,2))
'''
输出:
array([[5, 4],
[3, 7]])
'''
-
random.normal
函数,生成数值成正态分布(可指定平均值、标准差)的数组
import numpy as np
# 建立一维,数值成正态分布(均值为1,标准差为2)的数组
# 参数loc表明均值,scale表明标准差
np.random.normal(loc=1,scale=2,size=5)
'''
输出:
array([ 0.82962241, 0.41738042, 0.0470862 , 1.79446076, -1.47514478])
'''
random模块还有其余函数,这里很少说。

七、如何查看数组的维度?
前面说到,数组维度即表明轴的数量。
咱们能够经过数组(ndarray)对象的ndim或shape属性,来查看轴的数量。
-
ndim属性直接返回维度值; -
shape属性返回一个元组,元组的长度即表明维度值,里面的数字从左往右分别表明每一轴的元素数量。
import numpy as np
# 建立一维数组
x1 = np.array([1,2,3])
# 返回维度值
x1.ndim
'''
输出:1
'''
# 建立二维数组
x2 = np.array([[1,2,3],[4,5,6]])
# 返回形状
x2.shape
'''
输出:(2, 3)
元素长度为2表明二维,
元素2表明0轴有两个元素,
元素3表明1轴有3个元素。
'''
八、如何查看数组有多少个元素?
数组(ndarray)对象的size
属性能够查看数组包含元素总数。
import numpy as np
# 建立二维数组
x2 = np.array([[1,2,3],[4,5,6]])
# 查看元素总数
x2.size
'''
输出:6
'''
还能够经过shape
属性返回元素的乘积,来计算数组元素数量。
import numpy as np
from functools import reduce
# 建立二维数组
x2 = np.array([[1,2,3],[4,5,6]])
# 查看元素总数
reduce(lambda x,y:x*y , x2.shape)
'''
输出:6
shape形状:
(2,3)
'''
九、Numpy数组支持哪些数据类型?
Numpy支持的数据类型很是多,因此很适合作数值计算。下面给出常见的数据类型:
十、如何查看数组的类型?
数组(ndarrry)对象提供dtype
属性,用来查看数组类型。
import numpy as np
# 建立二维数组
x2 = np.array([[1,2,3],[4,5,6]],dtype=int)
# 返回类型
x2.dtype
'''
输出:dtype('int32')
'''
十一、如何改变数组的形状?
前面说过,数组的shape
属性返回一个元组,可以反映数组的形状,包括维度以及每一个轴的元素数量。
那么若是给定一个数组,怎么改变其形状呢?
经常使用的方式有两种:
-
reshape
方法,它返回一个新的数组,而不能改变原始数组。 -
resize
方法,无返回值,它更改了原始数组。
好比说我要将一个二维数组转换为三维数组。
import numpy as np
# 建立二维数组
x2 = np.array([[1,2,3],[4,5,6]])
# 将x2转换为三维数组,而且自定义每一个轴的元素数量
x2.reshape(1,2,3)
'''
输出:
array([[[1, 2, 3],
[4, 5, 6]]])
'''
reshape
方法能够传入整数或者元组形式的参数。
传入的参数和shape
属性返回的元组的含义是同样的。
例如, x2.reshape(1,2,3)
是将二维数组转换成三维数组,参数个数表明要转换的维度,参数数字从左到右分别表示0轴、1轴、2轴的元素数量。
resize
方法和reshape
方法使用形式同样,区别是resize
方法改变了原始数组形状。
import numpy as np
# 建立二维数组
x2 = np.array([[1,2,3],[4,5,6]])
# 将x2转换为三维数组,而且自定义每一个轴的元素数量
x2.resize((1,2,3))
x2
'''
输出:
array([[[1, 2, 3],
[4, 5, 6]]])
'''
十二、如何对数组进行索引和切片操做?
numpy一维数组的索引和切片操做相似python列表,这里很少讲。
好比说取一维数组前三个元素。
import numpy as np
# 建立一维数组
x1 = np.array([1,2,3,4])
# 切片,取前三个元素
x1[:3]
'''
输出:
array([1, 2, 3])
'''
重点是对多维数组的索引和切片。
多维数组有多个轴,那么就须要对每一个轴进行索引。
例如,三维数组形状为(x,y,z),分别表明:0轴有x个元素、1轴有y个元素,2轴有z个元素。
对0、一、2轴进行索引,若是取o轴第2个元素、1轴第0个元素、2轴第3个元素,那么索引形式就为[2,0,3]。
import numpy as np
# 建立三维数组
x3 = np.arange(24).reshape(3,2,4)
# 对该三维数组进行索引
x3[2,0,3]
'''
输出:19
三维数组形式:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
'''
切片也是一样道理。
若是取o轴前2个元素、1轴前1个元素、2轴后2个元素,那么切片形式就为[:2,:1,-2:]。
import numpy as np
# 建立三维数组
x3 = np.arange(24).reshape(3,2,4)
# 对该三维数组进行切片
x3[:2,:1,-2:]
'''
输出:
array([[[ 2, 3]],
[[10, 11]]])
三维数组形式:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
'''
1三、如何对数组里每一个元素进行迭代?
说到迭代,你们很容易想到直接对数组直接使用for
循环操做,对于一维数组来讲,固然是能够的。
import numpy as np
# 建立一维数组
x1 = np.array([1,2,3,4])
# 迭代
for i in x1:
print(i)
'''
输出:
1
2
3
4
'''
但对于多维数组,迭代是相对于0轴完成的,就是多维数组最外层的那一维。
你没有办法直接遍历数组里每个元素,嵌套循环又过低效。
这个时候就须要用到flat
方法,它能够将多维数组平铺为一维的迭代器。
import numpy as np
# 建立二维数组
x2 = np.array([[1,2,3],[4,5,6]])
# 先平铺,再迭代
for i in x2.flat:
print(i)
'''
输出:
1
2
3
4
5
6
'''
1四、如何将多维数组展开为一维数组?
数组(ndarray)对象提供了ravel方法,用来将多维数组展开为一维数组。
import numpy as np
# 建立er维数组
x3 = np.arange(12).reshape(3,4)
# 对该三维数组进行索引
x3.ravel()
'''
输出:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
'''
1五、什么广播机制?
广播(Broadcast)是 numpy 对不一样形状(shape)的数组进行数值计算的方式, 对多个数组的算术运算一般在相应的元素上进行。
较小的数组在较大的数组上“广播”,以便它们具备兼容的形状。
好比说一个一维数组乘以一个数字,至关于一维数组里每一个元素都乘以这个数。
import numpy as np
# 建立一维数组
x1 = np.array([1,2,3])
# 广播
x1 * 2
'''
输出:
array([2, 4, 6])
'''
若是相同维度的数组进行运算,其shape相同,那么广播就是两个数组相同位数的元素进行运算。

import numpy as np
# 建立一维数组
x1 = np.array([1,2,3])
x2 = np.array([4,5,6])
# 广播
x1 + x2
'''
输出:
array([5, 7, 9])
'''
若是两个数组维度不一样,进行运算,这里就触发了广播的两个规则。
-
让全部输入数组都向其中形状最长的数组看齐,形状中不足的部分都经过在前面加 1 补齐; -
当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。
这两个规则保证了不一样维度数组进行运算时,其维度自动调整成一致。

import numpy as np
# 建立一维数组
x1 = np.array([[1,2,3],[4,5,6]])
x2 = np.array([2,3,4])
# 广播
x1 - x2
'''
输出:
array([[-1, -1, -1],
[ 2, 2, 2]])
'''
1六、numpy中如何进行数值舍入操做?
-
around
函数,用于四舍五入,返回一个新数组
import numpy as np
# 建立一维数组
x1 = np.array([1.45,2.78,3.12])
# 四舍五入,到小数点后1位
np.around(x1,1)
'''
输出:
array([1.4, 2.8, 3.1])
'''
-
floor
函数,用于向下取整,返回一个新数组
import numpy as np
# 建立一维数组
x1 = np.array([1.45,2.78,3.12])
# 向下取整
np.floor(x1)
'''
输出:
array([1., 2., 3.])
'''
-
ceil
函数,用于向上取整,返回一个新数组
import numpy as np
# 建立一维数组
x1 = np.array([1.45,2.78,3.12])
# 向下取整
np.ceil(x1)
'''
输出:
array([2., 3., 4.])
'''
1七、如何对数组进行转置操做?
numpy提供了transpose
函数用以对数组进行维度的调换,也就是转置操做。
转置后返回一个新数组。
import numpy as np
# 建立二维数组
x1 = np.arange(12).reshape(3,4)
# 转置
np.transpose(x1)
'''
输出:
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
原数组:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
'''
固然,能够用更简单的方法。
数组对象提供了T
方法,用于转置,一样会返回一个新数组。
import numpy as np
# 建立二维数组
x1 = np.arange(12).reshape(3,4)
# 转置
x1.T
'''
输出:
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
原数组:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
'''
1八、如何链接两个相同维度的数组?
numpy的concatenate
函数用于沿指定轴链接相同形状的两个或多个数组。
import numpy as np
# 建立两个二维数组
x1 = np.array([[1,2,3],[4,5,6]])
x2 = np.array([[7,8,9],[10,11,12]])
# 链接,默认沿0轴链接
np.concatenate((x1,x2))
'''
输出:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
'''
# 指定沿1轴链接
np.concatenate((x1,x2),axis=1)
'''
输出:
array([[ 1, 2, 3, 7, 8, 9],
[ 4, 5, 6, 10, 11, 12]])
'''
1九、如何向数组添加值?
-
numpy的 append
函数向数组末尾追加值,能够指定不一样的轴。
import numpy as np
# 建立一个二维数组
x1 = np.array([[1,2,3],[4,5,6]])
# 直接向数组末尾添加元素,返回平铺的一维数组
np.append(x1,[7,8,9])
'''
输出:
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
'''
# 沿轴 0 添加元素
np.append(x1, [[7,8,9]],axis = 0)
'''
输出:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
'''
# 沿轴 1 添加元素
np.append(x1, [[5,5,5],[7,8,9]],axis = 1)
'''
输出:
array([[1, 2, 3, 5, 5, 5],
[4, 5, 6, 7, 8, 9]])
'''
-
numpy的 insert
函数能够沿给定轴,在数组中任意位置插入数据。
import numpy as np
# 建立一个二维数组
x1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 直接在指定位置插入元素,返回平铺的一维数组
np.insert(x1,2,[0,0,0])
'''
输出:
array([1, 2, 0, 0, 0, 3, 4, 5, 6, 7, 8, 9])
原数组:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
'''
# 指定位置,沿轴 0 插入元素
np.insert(x1,1,[0,0,0],axis=0)
'''
输出:
array([[1, 2, 3],
[0, 0, 0],
[4, 5, 6],
[7, 8, 9]])
'''
# 指定位置,沿轴 1插入元素
np.insert(x1,2,[0,0,0],axis=1)
'''
输出:
array([[1, 2, 0, 3],
[4, 5, 0, 6],
[7, 8, 0, 9]])
'''
20、如何对数组进行去重操做?
numpy的unique
函数用于去除数组中的重复元素,返回一个新数组。
import numpy as np
# 建立一个一维数组
x1 = np.array([2,3,5,1,3,8,1,0])
np.unique(x1)
'''
输出:
array([0, 1, 2, 3, 5, 8])
'''
unique
函数还能返回重复元素的索引、计数等信息,可去查文档自定义参数。
未完待续!
参考资料
numpy文档: https://www.numpy.org.cn/
[2]菜鸟教程: https://www.runoob.com/numpy/numpy-tutorial.html
-END-
TIPS
加入【Python数据分析】知识星球,带你走完数据科学流程!
往期精选
Python大数据分析
data creats value
长按二维码关注
本文分享自微信公众号 - Python大数据分析(pydatas)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。