主要介绍了numpy库的基础函数及简单使用,文中的注意部分,添加了作者的一些理解,以及与R语言的不同之处,作为作者的笔记

1.numpy的基本属性

导入numpy库,传统上numpy别名为np
方法array,创建数组

import numpy as np #导入numpy库并取别名为np
array=np.array([[1,2,3],
                [4,5,6],
                [7,8,9]])#新建一个数组

print(array)#输出数组
[[1 2 3]
 [4 5 6]
 [7 8 9]]

属性ndim,数组维度

print(array.ndim)#数组维度
2

注:[[[1,2,3],
[4,5,6],
[7,8,9]]]
是3维的数组

属性shape,数组形状

print(array.shape)#数组形状
(3, 3)#第一个3是3行,第二个3是3列

属性size,数组大小(数组中元素的个数)

print(array.size)#数组大小(数组中元素的个数)
9

属性dtype,数组中元素类型

print(array.dtype)#数组中元素类型
int32

注:二维数组其实就是矩阵

2.创建array

array方法,创建数组时指定元素类型

a=np.array([1,2,3],dtype=np.int32)#创建数组时指定元素类型
print(a.dtype)
int32

array方法,创建数组时指定元素类型(浮点型)

b=np.array([1,2,3],dtype=np.float)#(浮点型)
print(b.dtype)
float64

array方法,创建一维数组

c=np.array([1,2,3])#创建一维数组
print(c)
[1 2 3]

array方法,创建二维数组(矩阵)**[[[1,2,3]]]三维数组

d=np.array([[1,2,3],
          [4,5,6]])#创建二维数组(矩阵)**[[[1,2,3]]]三维数组
print(d)
[[1 2 3]
 [4 5 6]]

zeros方法,创建指定行列数量的数值全为0数组

zero=np.zeros((2,3))#创建指定行列数量的数值全为0数组
print(zero)
[[0. 0. 0.]
 [0. 0. 0.]]

#ones方法,创建指定行列数量的数值全为1数组

one=np.ones((3,4))#创建指定行列数量的数值全为1数组
print(one)
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]

empty方法,创建指定行列数量的数值全接近于0数组(但不等于0)

empty=np.empty((3,2))#创建指定行列数量的数值全接近于0数组(但不等于0)
print(empty)
[[2.33e-321 2.33e-321]
 [5.89e-321 5.89e-321]
 [6.03e-321 6.03e-321]]

arange方法,创建数组

e=np.arange(10)#创建[0-9]的数组,arange方法,默认从0开始,数值间隔是1,且左闭右开,因此取不到10
print(e)
[0 1 2 3 4 5 6 7 8 9]

arange方法,设置初始值为4,末尾值为12(但取不到末尾值,如下结果),数值间隔默认为1

f=np.arange(4,12)#初始值为4,末尾值为12(但取不到末尾值,如下结果)
print(f)
[ 4  5  6  7  8  9 10 11]

arange方法,指定了初始值,末尾值以及数值间隔

g=np.arange(1,20,3)#指定了初始值,数值间隔以及末尾值
print(g)
[ 1  4  7 10 13 16 19]

reshape方法,可以指定生成数组的维度,(行,列)

h=np.arange(8).reshape((2,4))#reshape方法可以指定生成数组的维度,(行,列)
print(h)
[[0 1 2 3]
 [4 5 6 7]]

3.numpy的基本运算

注:注释中涉及到对应位置的两个矩阵的运算时,这两个矩阵必须有相同的行列数量。
array方法,生成矩阵

arr1=np.array([[1,2,3],
              [4,5,6]])
arr2=np.array([[1,1,2],
               [2,3,3]])#生成矩阵
print(arr1)
print(arr2)
[[1 2 3]
 [4 5 6]]
 
[[1 1 2]
 [2 3 3]]

python基本数学运算(加,减,乘,除,幂运算,取余,取整)

print(arr1+arr2)#对应位置相加
print(arr1-arr2)#对应位置相减
print(arr1*arr2)#对应位置相乘
print(arr1/arr2)#对应位置相除
print(arr1**arr2)#对应位置幂运算
print(arr1%arr2)#对应位置取余
print(arr1//arr2)#对应位置取整
print(arr1+2)#所有的元素都加2 (-也一样)
print(arr1*10)#所有的元素都乘以10 (/也一样)
[[2 3 5]
 [6 8 9]]
 
 [[0 1 1]
 [2 2 3]]

[[ 1  2  6]
 [ 8 15 18]]

[[1.         2.         1.5       ]
 [2.         1.66666667 2.        ]]
 
[[  1   2   9]
 [ 16 125 216]]

[[0 0 1]
 [0 2 0]]

[[1 2 1]
 [2 1 2]]

[[3 4 5]
 [6 7 8]]

[[10 20 30]
 [40 50 60]]

运算符>,判断哪些元素大于3

arr3=arr1>3#判断哪些元素大于3
print(arr3)
[[False False False]
 [ True  True  True]]

方法dot,矩阵乘法

arr4=np.ones((3,5))
print(arr4)
np.dot(arr1,arr4)#矩阵乘法
arr1.dot(arr4)#矩阵乘法
[[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]
 
array([[ 6.,  6.,  6.,  6.,  6.],
       [15., 15., 15., 15., 15.]])
       
array([[ 6.,  6.,  6.,  6.,  6.],
       [15., 15., 15., 15., 15.]])

“T”实现矩阵转置

print(arr1.T)#矩阵转置
print(np.transpose(arr1))#矩阵转置
[[1 4]
 [2 5]
 [3 6]]
 
[[1 4]
 [2 5]
 [3 6]]

4.随机数生成以及矩阵的运算

random.random方法,生成3行2列从0到1的随机数

sample1=np.random.random((3,2))#生成3行2列从0到1的随机数
print(sample1)
[[0.0091066  0.88726298]
 [0.67338957 0.7218163 ]
 [0.83577629 0.31244609]]

random.normal方法,生成3行2列符合标准正态分布的随机数

sample2=np.random.normal(size=(3,2))#生成3行2列符合标准正态分布的随机数
print(sample2)
[[-0.5937719  -1.68314692]
 [-2.17329162 -1.24606196]
 [-0.64061484  0.8684897 ]]

random.randint方法,生成3行2列从0到10的随机整数(左闭右开)

sample3=np.random.randint(0,10,size=(3,2))#生成3行2列从0到10的随机整数(左闭右开)
print(sample3)
[[3 6]
 [1 6]
 [9 2]]

sum方法,求和

np.sum(sample1)#求和
3.4397978414661368

min方法,求最小值

np.min(sample1)#求最小值
0.009106601657770219

max方法,求最大值

np.max(sample1)#求最大值
0.8872629810672253

sum(matrix,axis=0/1)方法,对矩阵列/行求和
对矩阵列求和

np.sum(sample1,axis=0)#对矩阵列求和
array([1.51827246, 1.92152538])

对矩阵行求和

np.sum(sample1,axis=1)#对矩阵行求和
array([0.89636958, 1.39520588, 1.14822238])

#argmin方法,求最小值的索引(python中矩阵索引从0开始,横着数。R中矩阵索引从1开始,竖着数。)

np.argmin(sample1)#求最小值的索引(python中矩阵索引从0开始,横着数。R中矩阵索引从1开始,竖着数。)
0

argmax方法,求最大值的索引

np.argmax(sample1)#求最大值的索引
1

mean方法,求平均值

print(np.mean(sample1))#求平均值
print(sample1.mean())#求平均值
0.5732996402443561

0.5732996402443561

median方法,求中位数

np.median(sample1)#求中位数
0.6976029390777937

sqrt方法,开方

np.sqrt(sample1)#开方
array([[0.09542852, 0.94194638],
       [0.82060318, 0.84959773],
       [0.91420801, 0.55896878]])

random.randint方法,生成1行10列从0到10的随机整数(左闭右开)

sample4=np.random.randint(0,10,size=(1,10))#生成1行10列从0到10的随机整数(左闭右开)
print(sample4)
[[0 5 1 8 1 4 0 8 7 2]]

sort方法,排序

np.sort(sample4)#排序
array([[0, 0, 1, 1, 2, 4, 5, 7, 8, 8]])

sort方法参数为矩阵时,对矩阵的每一行进行排序

np.sort(sample1)#对矩阵的每一行进行排序
array([[0.0091066 , 0.88726298],
       [0.67338957, 0.7218163 ],
       [0.31244609, 0.83577629]])

clip方法,设置最大值和最小值,小于2的变成2,大于7的变成7

np.clip(sample4,2,7)#小于2的变成2,大于7的变成7
array([[2, 5, 2, 7, 2, 4, 2, 7, 7, 2]])

注:numpy中绝大多数区间都是左闭右开

5.numpy的索引

注:numpy中索引从0开始,python中负号(-)索引表示倒数第几个数据,例如-1代表数组倒数第一个元素即末尾元素a = np.array([1,2,3]),a[-1]=3 。而R中索引从1开始,负号(-)索引则代表删除这一索引下的元素,例如a <- c(1,2,3),a[-1]=2,3

生成数据

arr1=np.arange(2,14)
print(arr1)
[ 2  3  4  5  6  7  8  9 10 11 12 13]

第二个位置的数据

print(arr1[2])#第二个位置的数据
4

第一到第四个位置的数据

print(arr1[1:4])#第一到第四个位置的数据(左闭右开,因此不包括第四个)
[3 4 5]

倒数第一个位置的数据

print(arr1[-1])#倒数第一个位置的数据
13

第二到倒数第一个位置的数据

print(arr1[2:-1])#第二到倒数第一个位置的数据(左闭右开,因此不包括倒数第一个)
[ 4  5  6  7  8  9 10 11 12]

注:":“左边默认为0,”:"右边默认为倒数第一个位置(且包括这个位置
从第0个位置到第五个位置的数据

print(arr1[:5])#从第0个位置到第五个位置的数据(左闭右开,因此不包括倒数第五个)
[2 3 4 5 6]

从倒数第二个位置到末尾位置数据(且包括末尾位置数据)

print(arr1[-2:])#从倒数第二个位置到末尾位置数据
[12 13]

reshape函数,将数组调整为矩阵

arr2=arr1.reshape(3,4)#将数组调整为矩阵
print(arr2)
[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]

注意:在python的矩阵中基本单位为行,而在R中矩阵(matrix)的基本单位为每个单元(即一个数值),R中数据框(data.frame)的基本单元为列(理解为向量就是竖着排列的,而data.frame就是多向量的组合)
(python中矩阵中每个单元(即一个数值)的索引从0开始,横着数。R中矩阵和数据框索引从1开始,竖着数。)
在一些判断条件下(即需要返回索引值的函数),上面()中说的就是如何找到满足条件的元素(即一个数值)在矩阵和数据框中的位置。

返回位置为1的行(可以证明在python的矩阵中基本单位为行)

print(arr2[1])#返回位置为1的行
[6 7 8 9]

返回位置在1行1列的数据
注意:第二种方式类似R,R和python都是 ','左面是行, ','左面是列。

print(arr2[1][1])#返回位置在1行1列的数据
print(arr2[1,1])#返回位置在1行1列的数据
7

7

返回位置为2的列(即返回第三列)
注意:在R中arr2[,2]为返回第二列

print(arr2[:,2])#返回位置为2的列
[ 4  8 12]

注意:以下for循环证明python中矩阵的基本单位为行
迭代行

for i in arr2:#迭代行
    print(i)
[2 3 4 5]
[6 7 8 9]
[10 11 12 13]

迭代列

for i in arr2.T:#迭代列
    print(i)
[ 2  6 10]
[ 3  7 11]
[ 4  8 12]
[ 5  9 13]

迭代单元(迭代每个单元,即每个数值)
注:.flat可以实现数据格式的扁平化(以我目前的理解就是将多维数据格式拉到一维),arr2.flat实现了从二维数组即矩阵拉倒一维数组的操作

for i in arr2.flat:#迭代单元(迭代每个单元,即每个数值)
    print(i)
2
3
4
5
6
7
8
9
10
11
12
13

扁平化案例:
源字典为
{‘a’:{‘b’:1,‘c’:2},‘d’:{‘e’:3,‘f’:{‘g’:4}}}
扁平化后
{‘a.b’: 1, ‘a.c’: 2, ‘d.e’: 3, ‘d.f.g’: 4}