Loading

numpy的基础使用

@

import numpy as np

numpy的属性

array = np.array([
    [1,2,3],
    [2,3,4]
])
print(array)

[[1 2 3]
[2 3 4]]

print('number of dim:',array.ndim)  # 维度
# number of dim: 2

print('shape :',array.shape)    # 行数和列数
# shape : (2, 3)

print('size:',array.size)   # 元素个数
# size: 6

number of dim: 2
shape : (2, 3)
size: 6

numpy创建array

指定类型

a = np.array([2,23,4])  # list 1d
print(a)

[ 2 23 4]

a = np.array([2,23,4],dtype=np.int)
print(a.dtype)

int32

a = np.array([2,23,4],dtype=np.int64)
print(a.dtype)

int64

a = np.array([2,23,4],dtype=np.float)
print(a.dtype)

float64

a = np.array([2,23,4],dtype=np.float32)
print(a.dtype)

float32

创建特定数据

a = np.array([[2,23,4],[2,32,4]])  # 2d 矩阵 2行3列
print(a)

[[ 2 23 4]
[ 2 32 4]]

a = np.zeros((3,4)) # 数据全为0,3行4列
print(a)

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

a = np.ones((3,4),dtype = np.int)   # 数据为1,3行4列
print(a)

[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]

a = np.empty((3,4)) # 数据为empty,3行4列
print(a)

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

a = np.arange(10,20,2) # 10-19 的数据,2步长
print(a)

[10 12 14 16 18]

a = np.arange(12).reshape((3,4))    # 3行4列,0到11
print(a)

[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

a = np.linspace(1,10,6)    # 开始端1,结束端10,且分割成5个数据,生成线段
print(a)

[ 1. 2.8 4.6 6.4 8.2 10. ]

a = np.linspace(1,10,6).reshape((3,2)) # 更改shape
print(a)

[[ 1. 2.8]
[ 4.6 6.4]
[ 8.2 10. ]]

基础运算

数值运算

对每个元素进行运算

a=np.array([10,20,30,40])   # array([10, 20, 30, 40])
b=np.arange(4)              # array([0, 1, 2, 3])
print(a)
print(b)

[10 20 30 40]
[0 1 2 3]

c=a-b  # array([10, 19, 28, 37])
print(c)

[10 19 28 37]

c=a+b   # array([10, 21, 32, 43])
print(c)

[10 21 32 43]

c=a*b   # array([  0,  20,  60, 120])
print(c)

[ 0 20 60 120]

c=b**2  # array([0, 1, 4, 9])
print(c)

[0 1 4 9]

c=10*np.sin(a)  # array([-5.44021111,  9.12945251, -9.88031624,  7.4511316 ])
print(c)

[-5.44021111 9.12945251 -9.88031624 7.4511316 ]

c= b<3# array([ True,  True,  True, False], dtype=bool)
print(c)

[ True True True False]

a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))

print(a)
# array([[1, 1],
#       [0, 1]])

print(b)
# array([[0, 1],
#       [2, 3]])

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

统计

a=np.random.random((2,4))
print(a)

[[0.7314059 0.49061617 0.60155288 0.27811791]
[0.55631304 0.33982637 0.40576481 0.86569035]]

求和、最小值、最大值

print(np.sum(a))
print(np.min(a))   
print(np.max(a))  

2.49447115580787
0.002187250626131787
0.9493414655907044

print("sum =",np.sum(a,axis=1)) #对行进行运算
print("min =",np.min(a,axis=0)) #对列进行运算
print("max =",np.max(a,axis=1)) #对行进行运算

sum = [1.47274689 1.02172426]
min = [0.1077961 0.01160856 0.11037722 0.00218725]
max = [0.94934147 0.67224751]

根据统计方法求索引

A = np.arange(2,14).reshape((3,4)) 
print(A)

[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]

print(np.argmin(A))    # 0
print(np.argmax(A))    # 11

0
11

平均值、中位数

print(np.mean(A))       # 平均值
print(np.average(A))    # 平均值
print(A.mean())         # 平均值
print(np.median(A))       # 中位数

7.5
7.5
7.5
7.5

累加

结果的第n个数是前n个数相加

print(A)
print(np.cumsum(A)) 

[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
[ 2 5 9 14 20 27 35 44 54 65 77 90]

累差运算

后一个减去前一个

print(A)
print(np.diff(A)) 

[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
[[1 1 1]
[1 1 1]
[1 1 1]]

返回数组中非零元素的索引值数组

print(np.nonzero(A))

(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))

排序

import numpy as np
A = np.arange(14,2, -1).reshape((3,4)) 

print(A)
print(np.sort(A))  #每一行进行排序

[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
[[11 12 13 14]
[ 7 8 9 10]
[ 3 4 5 6]]

矩阵运算

a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))
print(a)
print(b)

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

矩阵的乘法

c_dot = np.dot(a,b)
print(c_dot)

[[2 4]
[2 3]]

c_dot_2 = a.dot(b)
print(c_dot_2)

[[2 4]
[2 3]]

矩阵的转置

print('原矩阵')
print(A)
print('写法一')
print(np.transpose(A))    
print('写法二')
print(A.T)#第二种写法

原矩阵
[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
写法一
[[14 10 6]
[13 9 5]
[12 8 4]
[11 7 3]]
写法二
[[14 10 6]
[13 9 5]
[12 8 4]
[11 7 3]]

切割

clip()函数,裁切,将小于和大于设定值的数改成设定值

print(A)

print(np.clip(A,5,9))    

[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
[[9 9 9 9]
[9 9 8 7]
[6 5 5 5]]

索引

一维索引

A = np.arange(3,15)
print(A)
print(A[3])    # 6

[ 3 4 5 6 7 8 9 10 11 12 13 14]
6

A = np.arange(3,15).reshape((3,4))
print(A)
print(A[2]) 

[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
[11 12 13 14]

二维索引

print(A[1][1])      # 8
print(A[1,1])      # 8

8
8

print(A[1, 1:3])    # [8 9]

[8 9]

对行遍历

for row in A:
    print(row)

[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]

对列遍历

for row in A.T:
    print(row)

[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]

迭代输出

这一脚本中的flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列。而flat是一个迭代器,本身是一个object属性。

A = np.arange(3,15).reshape((3,4))
         
print(A.flatten())   
# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

for item in A.flat:
    print(item ,end=" ")

[ 3 4 5 6 7 8 9 10 11 12 13 14]
3 4 5 6 7 8 9 10 11 12 13 14

Array的合并

A = np.array([1,1,1])
B = np.array([2,2,2])
   
C = np.vstack((A,B))      #vertical stack
print(C)    
D = np.hstack((A,B))      # horizontal stack
print(D)

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

print(A[np.newaxis,:])

print(A[:,np.newaxis])

[[1 1 1]]
[[1]
[1]
[1]]

A = np.array([1,1,1])[:,np.newaxis]
B = np.array([2,2,2])[:,np.newaxis]
         
C = np.concatenate((A,B,B,A),axis=0)
print(C)

D = np.concatenate((A,B,B,A),axis=1)
print(D)

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

array的分割

A = np.arange(12).reshape((3, 4))
print(A)

[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

等量分割

#分成两列
print(np.split(A, 2, axis=1))
#分成三行
print(np.split(A, 3, axis=0))
a,b,c =np.split(A, 3, axis=0)
print(a,b,c ,sep="\n")

[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[[0 1 2 3]]
[[4 5 6 7]]
[[ 8 9 10 11]]

不等量的分割

错误的分割

print(np.split(A, 3, axis=1))

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

~\anaconda3\lib\site-packages\numpy\lib\shape_base.py in split(ary, indices_or_sections, axis)
864 try:
--> 865 len(indices_or_sections)
866 except TypeError:

TypeError: object of type 'int' has no len()

During handling of the above exception, another exception occurred:

ValueError Traceback (most recent call last)

in
----> 1 print(np.split(A, 3, axis=1))

<array_function internals> in split(*args, **kwargs)

~\anaconda3\lib\site-packages\numpy\lib\shape_base.py in split(ary, indices_or_sections, axis)
869 if N % sections:
870 raise ValueError(
--> 871 'array split does not result in an equal division')
872 return array_split(ary, indices_or_sections, axis)
873

ValueError: array split does not result in an equal division

不等量分割正确的开启方式

print(A)
print(np.array_split(A, 3, axis=1))

[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]

其他的分割方式

print(np.vsplit(A, 3)) #等于 print(np.split(A, 3, axis=0))

print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1))

[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]

Numpy copy & deep copy

a = np.arange(4)
b = a
print(a)
a[0] = 11
print(a)
print(b)

[0 1 2 3]
[11 1 2 3]
[11 1 2 3]

b = a.copy()
print(b)
a[0] = 100
print(a)
print(b)

[11 1 2 3]
[100 1 2 3]
[11 1 2 3]


posted @ 2021-03-26 17:00  克豪  阅读(74)  评论(0)    收藏  举报