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)

<ipython-input-50-d557c50bd89b> in <module>
----> 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  克豪  阅读(63)  评论(0)    收藏  举报