Numpy学习

For python

Posted by Jiayue Cai on November 20, 2017

Last updated on 2017-11-26…

基本

import numpy as np 

生成

x = np.empty([3,2], dtype = int)      # [[0, 0],[0, 0],[0, 0]]
x = np.zeros((5,), dtype = np.int)    # [0 0 0 0 0]
x = np.ones(5)                        # [1. 1. 1. 1. 1.]

a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print (a[...,1])   # 第2列元素
print ("-----------")
print (a[1,...])   # 第2行元素
print ("-----------")
print (a[...,1:])  # 第2列及剩下的所有元素

[2 4 5]
-----------
[3 4 5]
-----------
[[2 3]
 [4 5]
 [5 6]]

转化

x =  [1,2,3] 
a = np.asarray(x)   # [1 2 3]

范围

a = np.arange(10) 
print (a)                    # [0 1 2 3 4 5 6 7 8 9]
print (a[2:])                # [2 3 4 5 6 7 8 9]
print (a[2:5]) #不包括末尾5  # [2 3 4] 

a = np.arange(10,20,2)       # [10, 12, 14, 16, 18]

a = np.arange(6).reshape(2,3) 
[[0, 1, 2],
 [3, 4, 5]]

遍历

a = np.arange(6).reshape(2,3)

for x in np.nditer(a):
    print (x, end=", " )          # 0, 1, 2, 3, 4, 5, 

for x in np.nditer(a.T):
    print (x, end=", " )          # 0, 1, 2, 3, 4, 5, 
    
for x in np.nditer(a.T.copy(order='C')):
    print (x, end=", " )          # 0, 3, 1, 4, 2, 5, 

从上述例子可以看出,a 和 a.T 的遍历顺序是一样的,也就是他们在内存中的存储顺序也是一样的 但是 a.T.copy(order = ‘C’) 的遍历结果是不同的,那是因为它和前两种的存储方式是不一样的,默认是按行访问

  • for x in np.nditer(a, order=’F’):Fortran order,即是列序优先;
  • for x in np.nditer(a.T, order=’C’):C order,即是行序优先;

运算

四舍五入与取整

import numpy as np 

a = np.array([1.0, 5.55,  123,  0.567,  25.532])  
print (np.around(a))                 #到整数部分 0.56->1.
print (np.around(a, decimals =  1))  #到最后一位 5.55->5.6

np.ceil(a)    #向上取整 -1.7 -> -1
np.floor(a)   #向下取整 -1.7 -> -2

算术运算

np.add(a,b)          #a+b
np.subtract(a,b)     #a-b
np.multiply(a,b)     #a*b
np.divide(a,b)       #a/b
np.mod(a,b)          #a%b   = np.remainder(a,b)
np.power(a,b)        #a^b
np.reciprocal(a)     #1/a

三角运算

a = np.array([0,30,45,60,90])

sin = np.sin(a*np.pi/180) # 通过乘 pi/180 转化为弧度  
cos = np.cos(a*np.pi/180)
tan = np.tan(a*np.pi/180)

inv = np.arcsin(sin) 
inv = np.arccos(cos)  
inv = np.arctan(tan)  

print (np.degrees(inv))  #转化为角度数

统计运算

np.percentile(a, q)       # 百分位数 q: 要计算的百分位数,在 0 ~ 100 之间
np.median(a)              # 中位数
np.mean(a)                # 平均值
np.var([1,2,3,4])

wts = np.array([4,3,2,1])  #加权平均
np.average(a,weights = wts)

排序

numpy.sort(a, axis, kind, order)

  • a: 要排序的数组
  • axis: 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序, axis=0 按列排序,axis=1 按行排序
  • kind: 默认为’quicksort’(快速排序),其他有’mergesort’(归并排序)、’heapsort’(堆排序)
  • order: 如果数组包含字段,则是要排序的字段
a = np.array([[3,7],[9,1]])  
[[3 7]
 [9 1]]

np.sort(a)
[[3 7]
 [1 9]]

np.sort(a, axis =  0)
[[3 1]
 [9 7]]

其他:numpy.lexsort() 用于对多个序列进行排序。把它想象成对电子表格进行排序,每一列代表一个序列,排序时优先照顾靠后的列。numpy.argmax() 和 numpy.argmin()函数分别沿给定轴返回最大和最小元素的索引。

线性代数

具体链接