在Python 3 环境下,根据切身使用Numpy经验,总结了一些小的常用的Numpy方法和技巧。

1. np.array 可将序列对象(如列表和元包)转换为数组,可以生成一维或多维数组,生成多维数组时要对齐。

a = [[1,2,3],[4,5,6]]
b = np.array(a)

  2. 数组与列表的相互转换 

a = np.ones((2,2))
b = a.tolist() # 数组转列表
c = [[1,2,3],[4,5,6]]
d = np.array(c) # 列表转数组
e = [1,2,3],[4,5,6]
g = np.array(e) #元组转数组

3. 低精度和高精度一起,会转换为高精度的

a = np.array((1,2.1,3,4,5,6))
b = a.reshape(2,3)
print(a.shape, a.dtype)

4. np.arange(n) 生成一维从0到n-1的向量,可以设定范围和步长,如np.arange(1,10,2)。Python 内置的range生成从0到n-1的列表,一般只用于for循环中。

a = np.arange(15)
for i in range(15):
  print(i)

指定创建什么形状,同时可以指定数据类型dtype。

a = np.ones((2,2), dtype = int)
b = np.zeros(10)

6. np.astype 实现数据类型转换,string类型的数字(如'123')也可以转换为int。

a = np.array((1,2,3,4))
print(a.dtype)
b = a.astype(np.float64)
print(b.dtype)

7. 大小相等的数组之间的任何运算都会元素级的,特别注意数组之间的乘法是元素级的,要实现矩阵乘法,需要用np.dot。

  8. 数组的切片是原始数组的视图,数据在赋值时不会复制,想要复制数据,需要在切片后加.copy()

[1,2], [:,3],[:2,3:] 注意索引的结尾数要减1,开头不需要。还有花式索引,a[[1,2,3]] 取对应的行,a[:,[1,2,3]]取对应的列,花式索引会复制数据,注意a[[1,2,3],[1,2,3]] 取的是3个对应位置的数字。进行反向索引时,要在数字前全部加负号,如[-2: -10:-1] 表示取向量的倒数第2个到倒数第10个,步长为2; [-1::-1]  表示从最后一个按照步长为1一直取到第1个。

a = np.arange(30).reshape(6,5)
b = a[:2,3:]
c = a[[1,5,2]]
d = a[:,[3,4,1]]

a = b[b[:,0] == c, :]   ##  取出某列中所有满足特定值的所有行,此式子为取出b中第0行里所有值等于c的所有行

a = b[~b[:,0] == c, :]  ##  反转,取出所有不满足该条件的

concatenate里axis=0对应列轴,=1对应横轴。hsplit, vsplit以及split(与concatenate对应)实现矩阵的指定份数的均等分。

a = np.ones((1,2))
b = np.zeros((3,2))
c =np.ones((3,3))
d = np.hstack((b,c))
e = np.concatenate((b,c),axis = 1)
f = np.vstack((a,b))
g, h, i = np.hsplit(c, 3)

11. 数组中最小最大元素的索引:np.argmin,np.argmax;数组中最小最大的元素:np.max,np.min。

a = np.arange(30).reshape(6,5)
b = np.argmax(a)

  12. Python内置zip函数,可以将多个可迭代对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表,当所有对象长度不一致时,以短的为主。

a = np.array((1,2,3))
b = np.array((4,5,6))
c = zip(a,b)
for i, j in zip(a,b):
 print(i,j)

  13. numpy.where(conditon[, x, y]) 条件逻辑表达式,方括号内可省去,如果条件为true,则其值取x,否则取y。 如果只有条件,则范围条件中非0元素的索引。其等效为 value = x if c else y for c, x, y in zip(condition, xarr, yarr)。

xarr = np.array([1.1, 1.2, 1.3, 1.4])
yarr = np.array([2.1, 2.2,2.3, 2.4])
condi = np.array([True, False, True, False])
value = np.where(condi, xarr, yarr)

   14. 基础数学和统计方法中,sum,mean, std, var(方差), min, max, argmin, argmax (arg系列返回最值的索引), cumsum等可以分别针对数组整体,以及axis = 0 (y轴,向), = 1 (x轴, 横向)进行数据统计。

a = np.random.randn(5,5) # 正态分布随机数
b = np.argmin(a)
c = np.argmin(a, axis = 0)
d = a.argmin(axis = 1)

  15. 对布尔型数组的方法, Python里0与False, 非0元素与True对应,针对布尔型数组的方法有,sum统计true的个数,实质对0与1的求和,any判断是否有true, all判断是否全为true。

a = np.array([False, True, False, False])
print(a.sum())
print(a.any())
print(a.all())

小到大的排序, argsort 是间接排序、返回数值从小到大的索引

a = np.random.randn(5,3)
b = np.sort(a) # 默认axis=0
b2 = np.sort(a, axis = 0) 
b3 = np.sort(a, axis = 1)

  17. 唯一化和集合逻辑: unique返回矩阵中唯一值的序列(即所有出现过元素的序列),python内置的set只能针对向量,返回向量中的唯一值序列,该序列只能作为迭代序列,一般用于for循环等迭代中。intersect1d(x,y) x与y的交集, union1d(x,y) x与yd的并集, in1d(x,y) x中的元素是否在y集合中, setdiff1d(x,y) 集合差 setxor1d(x,y)异或。

a = np.array(('Bob','Alice','Joe','Will','Bob','Joe'))
b = np.unique(a)
a2 = np.array((1,2,3,4,2,3,1,5,3,2,6,5,7,6,4))
b2 = np.unique(a2)
a3 = np.array([[1,2,3],[2,3,4],[1,2,4]])
b3 = np.unique(a3)
for item in set(a2):
 print (item)

  18. 线性代数操作, 主要方法有dot(点乘), diag(返回方阵对角元素), trace(返回方阵的迹), det(行列式), eig(f方阵特征值和特征向量), inv(方阵的逆), pinv(广义逆), qr(QR分解), svd(奇异值分解), slove(解方程AX=B)。

  19. 在Anconda中,针对向量和数组的处理是不同的,向量不分行向量和列向量,形式为size a(3, ) 是长度为3的向量;数组为size a(3,1)。在编程时,要注意区分,最好把向量转为数组。