Numpy的基础使用

附上参考链接
https://www.runoob.com/numpy/numpy-tutorial.html
https://www.cnblogs.com/TensorSense/p/6795995.html
https://docs.scipy.org/doc/numpy/
大数据挖掘常用的Python包
Numpy:科学计算包
Scipy:科学计算包
Pandas:数据分析处理包
Matplotlib:数据可视化库
Scikit-learn:机器学习库
这里只介绍numpy包

一、Numpy简介

NumPy是一个开源的Python科学计算基础库,提供了大量的数值编程工具,可以方便地处理向量、矩阵等运算。它包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy是SciPy、Pandas等数据处理或科学计算库的基础

二、Numpy的基本操作
0. 导入Numpy

import numpy as np

1. 创建数组

  • (1)从Python中的列表、元组等类型创建nd-array数组
    利用
    ① 从列表创建数组
import numpy as np
li = [1,5,6,8]
x = np.array(li)
print(x)
print(type(x))

结果:
[1 5 6 8]
<class 'numpy.ndarray'>

② 从元组创建数组

import numpy as np
tup = (5,4,8,6)
x = np.array(tup)
print(x)
print(type(x))

结果:
[5 4 8 6]
<class 'numpy.ndarray'>

③ 从列表和元组混合创建数组

import numpy as np
li = [1,5,6,8]
tup = (5,4,8,6)
x = np.array([li,tup]) #实际上这里依旧是列表创建数组
print(x)
print(type(x))

结果:
[[1 5 6 8]
 [5 4 8 6]]
<class 'numpy.ndarray'>
  • (2)使用Numpy函数创建数组

① arange(n)
import numpy as np
x1 = np.arange(10)
x2 = np.arange(5)
x3 = np.arange(1,11,2)
print(x1)
print(x2)
print(x3)

结果:
[0 1 2 3 4 5 6 7 8 9]
[0, 1, 2, 3, 4]
[1, 3, 5, 7, 9]

arange()有三个主要参数,start,stop,step,即起始、终止和步长。

② ones(shape)
参数shape指的是列表或者元组,数字个数指数组的维度,可以通过shape属性查看数组的形状。参数dtype是元素的类型有int,默认为float。

import numpy as np
x1 = np.ones(3) #一维数组
x2 = np.ones((2,3)) #二维数组
x3 = np.ones([2,3,4]) #三维数组

print(x1)
print()
print(x2)
print()
print(x3)
print(x1.shape)
print(x2.shape)
print(x3.shape)

结果:
[1. 1. 1.]

[[1. 1. 1.]
 [1. 1. 1.]]

[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]
 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]]

(3,)
(2, 3)
(2, 3, 4)

③ zeros(shape)
zeros与ones相似,只不过生成的元素是0.

import numpy as np
x1 = np.zeros(3) #一维数组
x2 = np.zeros((2,3)) #二维数组
x3 = np.zeros([2,3,4]) #三维数组

print(x1)
print()
print(x2)
print()
print(x3)

结果:
[0. 0. 0.]

[[0. 0. 0.]
 [0. 0. 0.]]

[[[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]
 [[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]]

④ full(shape,val)
用val填充一个shape形状的数组

import numpy as np
x = np.full((2,3),2) #用2填充2*3的二维数组
print(x)

结果:
[[2 2 2]
 [2 2 2]]

⑤ eye(n)
生成一个n*n维的单位矩阵

import numpy as np
x = np.eye(3)
print(x)

结果:
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
  • (3)利用其它函数创建nd-array数组

    ① linspace(start,stop,num,endpoint)


import numpy as np
x1 = np.linspace(1,10,3,dtype=int) # endpoint默认为True
print(x1)

x2 = np.linspace(1,10,3,dtype=int,endpoint=False)
print(x2)

结果:
[1 5 10]
[1 4 7]

② concatenate((a1,a2,...,an),aixs=0)
(a1,a2,...)是要连接的序列,aixs是行或者列,0是按列连接、1是按行连接,默认为0。
将两个或多个数组合并成一个数组

import numpy as np
a = np.array([[4,1],[3,2]])
b = np.array([[5,2],[8,9]])
c1 = np.concatenate([a,b])
c2 = np.concatenate((a,b),1)
print(a)
print()
print(b)
print()
print(c1)
print()
print(c2)

结果:
[[4 1]
 [3 2]]

[[5 2]
 [8 9]]

[[4 1]
 [3 2]
 [5 2]
 [8 9]]

[[4 1 5 2]
 [3 2 8 9]]

③ hstack(tup)和vstack(tup)
tup是元组

import numpy as np
a = np.array([[5,4],[8,6],[8,7]])
b = np.array([[1,2],[4,5],[2,2]])
c1 = np.hstack((a,b))
c2 = np.vstack((a,b))

print(a)
print()
print(b)
print()
print(c1)
print()
print(c2)

结果:
[[5 4]
 [8 6]
 [8 7]]

[[1 2]
 [4 5]
 [2 2]]

[[5 4 1 2]
 [8 6 4 5]
 [8 7 2 2]]

[[5 4]
 [8 6]
 [8 7]
 [1 2]
 [4 5]
 [2 2]]

2. 获取数组属性

数组属性

import numpy as np
a = np.array([[2,1,3],[1,4,5],[8,5,5]])
print(a)
print("a.ndim:",a.ndim)
print("a.shape:",a.shape)
print("a.size:",a.size)
print('a.dtype:',a.dtype)
print('itemsize:',a.itemsize)

结果:
[[2 1 3]
 [1 4 5]
 [8 5 5]]
a.ndim: 2
a.shape: (3, 3)
a.size: 9
a.dtype: int32
itemsize: 4

3. 随机生成、复制、排序、调整、转置数组

① 随机生成数组
有np.random.rand(),np.random.randn()两种方式,区别在于rand()只生成正数。

import numpy as np
x1 = np.random.randn(2,3) #生成一个2x3的二维数组
x2 = np.random.randn(3,4) #生成一个3x4的二维数组
x3 = np.random.randn(2,2,3) #生成一个2x2x3的三维数组

print(x1)
print()
print(x2)
print()
print(x3)

结果:
[[ 0.6919357   0.39917593 -0.0896835 ]
 [ 0.61647791  0.85612186 -0.93986079]]

[[-0.1696892  -1.66241796 -1.24078019  1.02316869]
 [ 1.05928049 -0.42552907  0.40492102 -0.78794536]
 [ 0.78318229  0.75858729 -0.44156901 -1.58432534]]

[[[ 0.85747856  1.61558974 -0.46686676]
  [ 1.22798477  1.26865842 -0.18074301]]
 [[-1.99597649  0.40527899  1.86830874]
  [-0.5422555   0.83269358 -0.33257266]]]

② 复制数组
np.copy(arr)

import numpy as np
a = np.array([[1,2,4],[2,5,6]])
a_copy = np.copy(a)
print(a)
print()
print('复制',a_copy)

结果:
[[1 2 4]
 [2 5 6]]

复制 [[1 2 4]
 [2 5 6]]

③ 排序数组
np.sort(a,axis=1)
axis=0 按列排序,axis=1按行排序

import numpy as np
a = np.array([[1,5,3],[8,7,2]])
b = np.sort(a)
c = np.sort(a,axis=0)
print(a)
print()
print(b)
print()
print(c)

结果:
[[1 5 3]
 [8 7 2]]

[[1 3 5]
 [2 7 8]]

[[1 5 2]
 [8 7 3]]

④ 调整数组
reshape(arr,newshape),调整数组的形状

import numpy as np
a = np.array([[1,5,3],[8,7,2]]) #这是一个2x3的二维数组
b = np.reshape(a,(3,2)) #调整为3x2的数组,但不能调整为2x4,4x2这样子的
print(a)
print()
print(b)

resize(a,newshape),调整数组的大小,可以调整为更大的数组,如果新数组大小大于原始大小,则包含原始数组中的元素的副本。

import numpy as np
a = np.array([[1,5,3],[8,7,2]]) #这是一个2x3的二维数组
b = np.resize(a,(3,4)) #调整为一个3x4的二维数组
print(a)
print()
print(b)

结果:
[[1 5 3]
 [8 7 2]]

[[1 5 3 8]
 [7 2 1 5]
 [3 8 7 2]]

⑤ 转置数组
arr.T

import numpy as np
a = np.array([[1,5,3],[8,7,2]]) #这是一个2x3的二维数组
aT = a.T
print(a)
print()
print(aT)

结果:
[[1 5 3]
 [8 7 2]]

[[1 8]
 [5 7]
 [3 2]]

4. 增加、删除元素


① 添加元素
1)从结尾增加元素,append(arr,values)

import numpy as np
a = np.array([[1,5,3],[8,7,2]])
print("添加元素之前:")
print(a)
a = np.append(a,10)
print("添加元素之后,变成了一维数组:")
print(a)

结果:
添加元素之前:
[[1 5 3]
 [8 7 2]]
添加元素之后,变成了一维数组:
[ 1  5  3  8  7  2 10]

沿0轴添加元素

import numpy as np
a = np.array([[1,5,3],[8,7,2]])
print("添加之前")
print(a)
a = np.append(a,[[2,5,6]],axis=0)
print("沿0轴添加元素")
print(a)

结果:
添加之前
[[1 5 3]
 [8 7 2]]
沿0轴添加元素
[[1 5 3]
 [8 7 2]
 [2 5 6]]

沿1轴添加元素

import numpy as np
a = np.array([[1,5,3],[8,7,2]])
print("添加之前")
print(a)
#a = np.append(a,[[2,5,6]],axis=1)按1轴,必须两个维度都要增加
a = np.append(a,[[2,5,6],[1,5,5]],axis=1)
print("沿1轴添加元素")
print(a)

结果:
添加之前
[[1 5 3]
 [8 7 2]]
沿1轴添加元素
[[1 5 3 2 5 6]
 [8 7 2 1 5 5]]

2)从指定位置增加元素,insert(arr,index,values)
普通插入

import numpy as np
a = np.arange(12).reshape(4,3)
print("添加之前")
print(a)
a = np.insert(a,2,[1,5,7])
print("在索引为2的元素之前插入,变为一维数组:")
print(a)

结果:
添加之前
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
在索引为2的元素之前插入,变为一维数组:
[ 0  1  1  5  7  2  3  4  5  6  7  8  9 10 11]

按行(0轴)索引插入

import numpy as np
a = np.arange(12).reshape(4,3)
print("添加之前")
print(a)
a = np.insert(a,2,[1,5,7],0)
print("按行索引插入,在行索引为2的行之前插入:")
print(a)

结果:
添加之前
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
按行索引插入,在行索引为2的行之前插入:
[[ 0  1  2]
 [ 3  4  5]
 [ 1  5  7]
 [ 6  7  8]
 [ 9 10 11]]

按列(1轴)索引插入

import numpy as np
a = np.arange(12).reshape(4,3)
print("添加之前")
print(a)
#a = np.insert(a,2,[1,5,7],1) 注意,按列来的话,有四个元素
a = np.insert(a,2,[1,5,7,4],1)
print("按列索引插入,在列索引为2的列之前插入:")
print(a)

结果:
添加之前
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
按列索引插入,在列索引为2的列之前插入:
[[ 0  1  1  2]
 [ 3  4  5  5]
 [ 6  7  7  8]
 [ 9 10  4 11]]

② 删除元素
普通删除,返回一维数组

import numpy as np
a = np.arange(10).reshape(5,2)
print("删除之前:")
print(a)
a = np.delete(a,2)
print("删除之后:")
print(a)

结果:
删除之前:
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
删除之后:
[0 1 3 4 5 6 7 8 9]

np.delete(arr,index,axis=0):删除数组arr第index+1行所有的元素,返回ndarray对象

import numpy as np
a = np.arange(10).reshape(5,2)
print("删除之前:")
print(a)
a = np.delete(a,2,axis=0)
print("删除之后:")
print(a)

结果:
删除之前:
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
删除之后:
[[0 1]
 [2 3]
 [6 7]
 [8 9]]

np.delete(arr,index,axis=1):删除数组arr第index+1列所有的元素,返回ndarray对象

import numpy as np
a = np.arange(10).reshape(2,5)
print("删除之前:")
print(a)
a = np.delete(a,2,axis=1)
print("删除之后:")
print(a)

结果:
删除之前:
[[0 1 2 3 4]
 [5 6 7 8 9]]
删除之后:
[[0 1 3 4]
 [5 6 8 9]]

5. 数组的索引、切片、子集
① 索引:获取数组中特定位置元素的过程
一维数组的索引,与序列相似

import numpy as np
a = np.array([4,2,6,1,7])
print(a)
print("查找索引为3的元素:")
print(a[3])

结果:
[4 2 6 1 7]
查找索引为3的元素:
1

多维数组的索引每个维度一个索引值,逗号分割

import numpy as np
a = np.arange(24).reshape(2,3,4) #生成一个2x3x4的三维数组
print(a)
print("查找第一维度索引为1的数组")
print("a[1]:")
print(a[1])
print("查找第一维度索引为1、第二维度索引为2的数组")
print("a[1,2]:")
print(a[1,2])
print("查找第一维度索引为1、第二维度索引为2、第三维度索引为3的元素:")
print("a[1,2,3]:")
print(a[1,2,3])

结果:
[[[ 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的数组
a[1]:
[[12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]
查找第一维度索引为1、第二维度索引为2的数组
a[1,2]:
[20 21 22 23]
查找第一维度索引为1、第二维度索引为2、第三维度索引为3的元素:
a[1,2,3]:
23

② 切片:获取数组元素子集的过程
一维数组的切片,与序列相似,有start、stop、step

import numpy as np
a = np.array([4,2,6,1,7,19,12])
print(a)
print("切出从索引0到索引4的元素:")
print("a[:5]:")
print(a[:5])

print("切出从索引1到索引5的元素:")
print("a[1:6]:")
print(a[1:6])

print("以间隔为2,切出元素:")
print("a[::2]:")
print(a[::2])

结果:
[ 4  2  6  1  7 19 12]
切出从索引0到索引4的元素:
a[:5]:
[4 2 6 1 7]
切出从索引1到索引5的元素:
a[1:6]:
[ 2  6  1  7 19]
以间隔为2,切出元素:
a[::2]:
[ 4  6  7 12]

多维数组的切片选取一个维度用: 每个维度切片方法与一维数组相同。
a[第一个维度,第二个维度,第三个维度]

import numpy as np
a = np.arange(24).reshape((2,3,4))
print(a)
print("第一维度不切片、第二维度切索引为1到2的、第三维度切0到3的片段")
print("操作:a[:,1:3,:4]")
print(a[:,1:3,:4])

print("第一维度不切片、第二维度切索引为1到2的、第三维度以步长为2切片")
print("操作:a[:,1:3,::2]")
print(a[:,1:3,::2])

print("第一维度得到最后一片、第二维度切索引为1到2的、第三维度以步长为2切片")
print("操作:a[1,1:3,::2]")
print(a[1,1:3,::2])

结果:
[[[ 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到2的、第三维度切0到3的片段
操作:a[:,1:3,:4]
[[[ 4  5  6  7]
  [ 8  9 10 11]]
 [[16 17 18 19]
  [20 21 22 23]]]
第一维度不切片、第二维度切索引为1到2的、第三维度以步长为2切片
操作:a[:,1:3,::2]
[[[ 4  6]
  [ 8 10]]
 [[16 18]
  [20 22]]]
第一维度得到最后一片、第二维度切索引为1到2的、第三维度以步长为2切片
操作:a[1,1:3,::2]
[[16 18]
 [20 22]]

6. 标量运算

标量运算

① add(arr,num)

import numpy as np
a = np.array([[2,1],[3,2]])
print(a)
print("加法:")
print("np.add(a,2)")
print(np.add(a,2))

结果:
[[2 1]
 [3 2]]
加法:
np.add(a,2)
[[4 3]
 [5 4]]

② subtract(arr,num)

import numpy as np
a = np.array([[2,1],[3,2]])
print(a)
print("减法:")
print("np.subtract(a,2)")
print(np.subtract(a,2))

结果:
[[2 1]
 [3 2]]
减法:
np.subtract(a,2)
[[ 0 -1]
 [ 1  0]]

③ multiply(arr,num)

import numpy as np
a = np.array([[2,1],[3,2]])
print(a)
print("乘法:")
print("np.multiply(a,2)")
print(np.multiply(a,2))

结果:
[[2 1]
 [3 2]]
乘法:
np.multiply(a,2)
[[4 2]
 [6 4]]

④ divide(arr,num)

import numpy as np
a = np.array([[2,1],[3,2]])
print(a)
print("除法:")
print("np.divide(a,2)")
print(np.divide(a,2))

结果:
[[2 1]
 [3 2]]
除法:
np.divide(a,2)
[[1.  0.5]
 [1.5 1. ]]

⑤ power(arr,num)

import numpy as np
a = np.array([[2,1],[3,2]])
print(a)
print("幂运算:")
print("np.power(a,2)")
print(np.power(a,2))

结果:
[[2 1]
 [3 2]]
幂运算:
np.power(a,2)
[[4 1]
 [9 4]]

7. 向量运算


① np.add(arr1,arr2):两个数组对应元素相加

import numpy as np
a = np.array([1,2,5,6]).reshape(2,2)
b = np.array([6,5,2,1]).reshape(2,2)
c = np.add(a,b)
print('这是a数组')
print(a)
print('这是b数组')
print(b)
print('np.add(a,b),a,b两个数组对应元素相加')
print(c)

结果:
这是a数组
[[1 2]
 [5 6]]
这是b数组
[[6 5]
 [2 1]]
np.add(a,b),a,b两个数组对应元素相加
[[7 7]
 [7 7]]

② np.subtract(arr1,arr2):两个数组对应元素相减

import numpy as np
a = np.array([1,2,5,6]).reshape(2,2)
b = np.array([6,5,2,1]).reshape(2,2)
c = np.subtract(a,b)
print('这是a数组')
print(a)
print('这是b数组')
print(b)
print('np.subtract(a,b),a,b两个数组对应元素相减')
print(c)

结果:
这是a数组
[[1 2]
 [5 6]]
这是b数组
[[6 5]
 [2 1]]
np.subtract(a,b),a,b两个数组对应元素相减
[[-5 -3]
 [ 3  5]]

③ np.multiply(arr1,arr2):两个数组对应元素相乘,而不是矩阵相乘的法则。

import numpy as np
a = np.array([1,2,5,6]).reshape(2,2)
b = np.array([6,5,2,1]).reshape(2,2)
c = np.multiply(a,b)
print('这是a数组')
print(a)
print('这是b数组')
print(b)
print('np.multiply(a,b),a,b两个数组对应元素相乘')
print(c)

结果:
这是a数组
[[1 2]
 [5 6]]
这是b数组
[[6 5]
 [2 1]]
np.multiply(a,b),a,b两个数组对应元素相乘
[[ 6 10]
 [10  6]]

④ np.divide(arr1,arr2):两个数组对应元素相除

import numpy as np
a = np.array([12,10,1,6]).reshape(2,2)
b = np.array([6,5,2,1]).reshape(2,2)
c = np.divide(a,b)
print('这是a数组')
print(a)
print('这是b数组')
print(b)
print('np.divide(a,b),a,b两个数组对应元素相除')
print(c)

结果:
这是a数组
[[12 10]
 [ 1  6]]
这是b数组
[[6 5]
 [2 1]]
np.divide(a,b),a,b两个数组对应元素相除
[[2.  2. ]
 [0.5 6. ]]

⑤ np.power(arr1,arr2):将数组arr2中的元素作为数组arr1的对应元素的指数

import numpy as np
a = np.array([1,2,5,6]).reshape(2,2)
b = np.array([6,5,2,2]).reshape(2,2)
c = np.power(a,b)
print('这是a数组')
print(a)
print('这是b数组')
print(b)
print('np.power(a,b),将b的元素作为a对应元素的指数')
print(c)

结果:
这是a数组
[[1 2]
 [5 6]]
这是b数组
[[6 5]
 [2 2]]
np.power(a,b),将b的元素作为a对应元素的指数
[[ 1 32]
 [25 36]]

⑥ np.abs(x) np.fabs(x):计算数组各元素的绝对值

import numpy as np
a = np.array([-1,-2,5,6]).reshape(2,2)
b = np.array([-6,-5,2,1]).reshape(2,2)
c = np.abs(a)
d = np.fabs(b)
print('这是a数组')
print(a)
print('这是b数组')
print(b)
print('np.abs(a)')
print(c)
print('np.fabs(b),元素变为浮点型')
print(d)

结果:
这是a数组
[[-1 -2]
 [ 5  6]]
这是b数组
[[-6 -5]
 [ 2  1]]
np.abs(a)
[[1 2]
 [5 6]]
np.fabs(b),元素变为浮点型
[[6. 5.]
 [2. 1.]]

⑦ np.sqrt(x):计算数组各元素的平方根

import numpy as np
a = np.array([1,4,16,36]).reshape(2,2)
c = np.sqrt(a)
print('这是a数组')
print(a)
print('np.sqrt(a),计算数组a各元素的平方根')
print(c)

结果:
这是a数组
[[ 1  4]
 [16 36]]
np.sqrt(a),计算数组a各元素的平方根
[[1. 2.]
 [4. 6.]]

⑧ np.square(x):计算数组各元素的平方

import numpy as np
a = np.array([1,2,5,6]).reshape(2,2)
c = np.square(a)
print('这是a数组')
print(a)
print('np.square(a),计算数组a各元素的平方')
print(c)

结果:
这是a数组
[[1 2]
 [5 6]]
np.square(a),计算数组a各元素的平方
[[ 1  4]
 [25 36]]

⑨ np.log(x)、np.log10(x)、np.log2(x)
np.log(x):计算数组各元素的自然对数

import numpy as np
a = np.array([np.e,2,10,6]).reshape(2,2)
c = np.log(a)
print('这是a数组')
print(a)
print('np.log(a),计算数组a各元素的自然对数')
print(c)

结果:
这是a数组
[[ 2.71828183  2.        ]
 [10.          6.        ]]
np.log(a),计算数组a各元素的自然对数
[[1.         0.69314718]
 [2.30258509 1.79175947]]

np.log10(x):计算数组各元素的10底对数

import numpy as np
a = np.array([10,100,1000,2]).reshape(2,2)
c = np.log10(a)
print('这是a数组')
print(a)
print('np.log10(a),计算数组a各元素的10底对数')
print(c)

结果:
这是a数组
[[  10  100]
 [1000    2]]
np.log10(a),计算数组a各元素的10底对数
[[1.      2.     ]
 [3.      0.30103]]

np.log2(x):计算数组各元素的2底对数

import numpy as np
a = np.array([2,16,32,4]).reshape(2,2)
c = np.log2(a)
print('这是a数组')
print(a)
print('np.log2(a),计算数组a各元素的2底对数')
print(c)

结果:
这是a数组
[[ 2 16]
 [32  4]]
np.log2(a),计算数组a各元素的2底对数
[[1. 4.]
 [5. 2.]]

⑩ np.ceil(x)、np.floor(x)
np.ceil(x):数组各元素向上取整

import numpy as np
a = np.random.randn(2,2)
c = np.ceil(a)
print('这是a数组')
print(a)
print('np.ceil(a),数组a各元素向上取整')
print(c)

结果:
这是a数组
[[ 0.35828912  1.21284634]
 [-0.78966178  0.01141592]]
np.ceil(a),数组a各元素向上取整
[[ 1.  2.]
 [-0.  1.]]

np.floor(x):数组各元素向下取整

import numpy as np
a = np.random.randn(2,2)
c = np.floor(a)
print('这是a数组')
print(a)
print('np.floor(a),数组a各元素向下取整')
print(c)

结果:
这是a数组
[[-0.92498697 -0.24792889]
 [-0.7291078   1.64891259]]
np.floor(a),数组a各元素向下取整
[[-1. -1.]
 [-1.  1.]]

8. 统计函数


① mean(arr,axis):计算数组中的均值,axis是指定轴的均值,0是求每列的均值,1是求每行的均值

import numpy as np
a = np.array([[2,1],[5,2]])
print(a)
print("求a的均值,np.mean(a)")
print(np.mean(a))

print("求a每列的均值,np.mean(a,axis=0)")
print(np.mean(a,axis=0))

print("求a每行的均值,np.mean(a,axis=1)")
print(np.mean(a,axis=1))

结果:
[[2 1]
 [5 2]]
求a的均值,np.mean(a)
2.5
求a每列的均值,np.mean(a,axis=0)
[3.5 1.5]
求a每行的均值,np.mean(a,axis=1)
[1.5 3.5]

② var():返回数组arr中所有元素的方差

import numpy as np
a = np.array([[2,1],[5,2]])
print(a)
print("求a的方差,np.var(a)")
a_var = np.var(a)
print(a_var)

结果:
[[2 1]
 [5 2]]
求a的方差,np.var(a)
2.25

③ std():返回数组arr中所有元素的标准差

import numpy as np
a = np.array([[2,1],[5,2]])
print(a)
print("求a的标准差,np.std(a)")
a_std = np.std(a)
print(a_std)

结果:
[[2 1]
 [5 2]]
求a的方差,np.std(a)
1.5

④ corrcoef():返回数组arr中所有元素的相关系数

import numpy as np
a = np.array([[2,1],[5,2]])
print(a)
print("求a的相关系数,np.corrcoef(a)")
a_corrcoef = np.corrcoef(a)
print(a_corrcoef)

结果:
[[2 1]
 [5 2]]
求a的相关系数,np.corrcoef(a)
[[1. 1.]
 [1. 1.]]

⑤ sum():返回数组arr所有元素之和

import numpy as np
a = np.array([[2,1],[5,2]])
print(a)
print("求a的和,np.sum(a)")
a_sum = np.sum(a)
print(a_sum)

结果:
[[2 1]
 [5 2]]
求a的和,np.sum(a)
10

⑥ min():返回数组arr中最小元素

import numpy as np
a = np.array([[2,1],[5,2]])
print(a)
print("求a的最小元素,np.min(a)")
a_min = np.min(a)
print(a_min)

结果:
[[2 1]
 [5 2]]
求a的最小元素,np.min(a)
1

⑦ max():返回数组arr中最大元素

import numpy as np
a = np.array([[2,1],[5,2]])
print(a)
print("求a的最大元素,np.max(a)")
a_max = np.max(a)
print(a_max)

结果:
[[2 1]
 [5 2]]
求a的最大元素,np.max(a)
5

9. 矩阵的操作
科学计算中大量使用到矩阵运算,NumPy提供了矩阵对象。矩阵对象和数组对象主要有两点差别:
矩阵是二维的,而数组可以是任意正整数维
矩阵的*操作符进行的是矩阵乘法,乘号左侧的矩阵列和乘号右侧的矩阵行大小要相等,而数组的*操作符是对应元素两两相乘,乘号两侧的数组每一维大小都需要一致。
① 矩阵的生成
1)np.asmatrix(arr)

import numpy as np
a = np.arange(15).reshape(3,5)
print('这是数组a')
print(a)
print('a的类型')
print(type(a))
m = np.asmatrix(a)
print('将数组a转为矩阵m,np.asmatrix(a),得矩阵m')
print(m)
print('m的类型')
print(type(m))

结果:
这是数组a
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
a的类型
<class 'numpy.ndarray'>
将数组a转为矩阵m,np.asmatrix(a),得矩阵m
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
m的类型
<class 'numpy.matrix'>

2)np.matrix(arr)

import numpy as np
m = np.matrix('1,2,8;6,5,3;4,9,7')
#使用该函数时,内部需为字符串,每行用分号隔开
print("矩阵m")
print(m)
print("查看类型type(m)")
print(type(m))

结果:
矩阵m
[[1 2 8]
 [6 5 3]
 [4 9 7]]
查看类型type(m)
<class 'numpy.matrix'>

3)np.mat(arr)

import numpy as np
a = np.arange(2,45,3).reshape(5,3)
print('这是数组a')
print(a)
print('a的类型')
print(type(a))
m = np.mat(a)
print('将数组a转为矩阵m,np.mat(a),得矩阵m')
print(m)
print('m的类型')
print(type(m))

结果:
这是数组a
[[ 2  5  8]
 [11 14 17]
 [20 23 26]
 [29 32 35]
 [38 41 44]]
a的类型
<class 'numpy.ndarray'>
将数组a转为矩阵m,np.mat(a),得矩阵m
[[ 2  5  8]
 [11 14 17]
 [20 23 26]
 [29 32 35]
 [38 41 44]]
m的类型
<class 'numpy.matrix'>

② 矩阵的乘法
直接按照矩阵的乘法来计算,用*来进行矩阵相乘,左矩阵的列数要等于右矩阵的行数

import numpy as np
left_m = np.mat(np.arange(1,5).reshape(2,2))
right_m = np.mat(np.arange(1,8,2).reshape(2,2))
print('左矩阵left_m')
print(left_m)
print('右矩阵right_m')
print(right_m)

print('两个矩阵相乘')
print(left_m * right_m)

结果:
左矩阵left_m
[[1 2]
 [3 4]]
右矩阵right_m
[[1 3]
 [5 7]]
两个矩阵相乘
[[11 17]
 [23 37]]

③ 矩阵的转置
1)matrix.T

import numpy as np
m = np.mat(np.arange(9).reshape(3,3))
print("矩阵m")
print(m,'\n')
print("m的转置T,矩阵矩阵m.T")
print(m.T)

结果:
矩阵m
[[0 1 2]
 [3 4 5]
 [6 7 8]] 

m的转置T,矩阵矩阵m.T
[[0 3 6]
 [1 4 7]
 [2 5 8]]

2)np.transope(matrix)

import numpy as np
m = np.mat(np.arange(9).reshape(3,3))
print("矩阵m")
print(m,'\n')
print("m的转置T,矩阵矩阵np.transope(m)")
print(np.transpose(m))

结果:
矩阵m
[[0 1 2]
 [3 4 5]
 [6 7 8]] 

m的转置T,矩阵矩阵np.transope(m)
[[0 3 6]
 [1 4 7]
 [2 5 8]]

④ 求逆矩阵
linalg是numpy中用于线性代数计算的模块,是linear algebra的简写

导入linalg

inv()函数求逆矩阵

import numpy as np
import numpy.linalg as nlg
m = np.mat(np.array([[4,9],[3,10]]))
inverse_m = nlg.inv(m)

print("矩阵m")
print(m,'\n')
print('m的逆矩阵,nlg.inv(m)')
print(inverse_m,'\n')
print('检验,inverse_m * m == 单位矩阵?')
print(inverse_m * m)


结果:
矩阵m
[[ 4  9]
 [ 3 10]] 

m的逆矩阵,nlg.inv(m)
[[ 0.76923077 -0.69230769]
 [-0.23076923  0.30769231]] 

检验,inverse_m * m == 单位矩阵?
[[1. 0.]
 [0. 1.]]

10. 缺失值
缺失值在量化分析中也是一种信息,NumPy提供了nan作为缺失值的记录,通过isnan函数判定是否为缺失值。nan_to_num函数可以将nan替换成0。

np.nan可以得到缺失值,能将浮点数转为缺失值

import numpy as np
a = np.array([[1,2],[3,4]],dtype=float)
print(a)
a[0,1] = np.nan
print("a[0,1]修改成缺失值之后")
print(a)

结果:
[[1. 2.]
 [3. 4.]]
a[0,1]修改成缺失值之后
[[ 1. nan]
 [ 3.  4.]]

isnan函数可以判断是否有缺失值

import numpy as np
a = np.array([[1,2],[3,4]],dtype=float)
print(a)
a[0,1] = np.nan
print("a[0,1]修改成缺失值之后")
print(a)
print("isnan(a):")
print(np.isnan(a))

结果:
[[1. 2.]
 [3. 4.]]
a[0,1]修改成缺失值之后
[[ 1. nan]
 [ 3.  4.]]
isnan(a):
[[False  True]
 [False False]]

nan_to_num函数可以将nan值替换为0

import numpy as np
a = np.array([[1,2],[3,4]],dtype=float)
print(a)
a[0,1] = np.nan
print("a[0,1]修改成缺失值之后")
print(a)
a = np.nan_to_num(a)
print("将缺失值变为0,nan_to_num()")
print(a)

结果:
[[1. 2.]
 [3. 4.]]
a[0,1]修改成缺失值之后
[[ 1. nan]
 [ 3.  4.]]
将缺失值变为0,nan_to_num()
[[1. 0.]
 [3. 4.]]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 前言 numpy是支持 Python语言的数值计算扩充库,其拥有强大的高维度数组处理与矩阵运算能力。除此之外,nu...
    TensorFlow开发者阅读 3,205评论 0 35
  • 介绍 NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和...
    喔蕾喔蕾喔蕾蕾蕾阅读 1,763评论 0 5
  • 介绍 NumPy是Python数值计算最重要的基础包,大多数提供科学计算的包都是用NumPy的数组作为构建基础。N...
    无味之味阅读 7,691评论 0 3
  • 一、numpy概述 numpy(Numerical Python)提供了python对多维数组对象的支持:ndar...
    L_steven的猫阅读 3,461评论 1 24
  • 其实手绘并不难哒~与其羡慕别人精美好看的作品 不如自己动手去画起来哦,抓住闲暇的时光,绘出你心中所想,有想学绘画的...
    葡萄_f8b1阅读 226评论 0 3