强制类型转换

  1. >>> a=np.array([1.1, 1.2])
  2. >>> a.dtype
  3. dtype('float64')
  4. >>> a.dtype=np.int16
  5. >>> a.dtype
  6. dtype('int16')
  7. >>> a
  8. array([-26214, -26215, -26215, 16369, 13107, 13107, 13107, 16371], dtype=int16)
  9. #原来float64相当于4个int16的位宽,这样强制转换后会将他们直接拆开成4个数,
  10. #因此原来的两个float64成了8个int16
  11. >>> a=np.array([1.1, 1.2])
  12. >>> a.dtype
  13. dtype('float64')
  14. >>> a.astype(np.int16)
  15. array([1, 1], dtype=int16)
  16. >>> a.dtype
  17. dtype('float64') #a的数据类型并没有变
  18. >>> a=a.astype(np.int16) #赋值操作后a的数据类型变化
  19. >>> a
  20. array([1, 1], dtype=int16)
  21. # 使用赋值法才可以对数据转换astype
  22. # dtype查看数据类型
  23. >>> float(b)#直接解决问题...

函数

floor:

向下取整

  1. >>> a
  2. array([-1.7, -1.5, -0.2, 0.2, 1.5, 1.7, 2. ])
  3. >>>
  4. >>> np.floor(a)
  5. array([-2., -2., -1., 0., 1., 1., 2.])

zeros:

  1. np.zeros((a,b))#两个括号

squeeze:

  1. numpy.squeeze(a,axis = None)

    作用:从数组的形状中删除单维度条目,即把shape中为1的维度去掉 引用https://docs.scipy.org/doc/numpy/reference/generated/numpy.squeeze.html 场景:在机器学习和深度学习中,通常算法的结果是可以表示向量的数组(即包含两对或以上的方括号形式[[]]),如果直接利用这个数组进行画图可能显示界面为空(见后面的示例)。我们可以利用squeeze()函数将表示向量的数组转换为秩为1的数组,这样利用matplotlib库函数画图时,就可以正常的显示结果了。 技巧:np.squeeze()函数可以删除数组形状中的单维度条目,即把shape中为1的维度去掉,但是对非单维的维度不起作用。

  1. 1a表示输入的数组;
  2. 2axis用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;
  3. 3axis的取值可为None int tuple of ints, 可选。若axis为空,则删除所有单维度的条目;
  4. 4)返回值:数组
  5. 5) 不会修改原数组;
  6. # 绘图
  7. import matplotlib.pyplot as plt
  8. import numpy as np
  9. %matplotlib inline
  10. #无法正常显示图示案例
  11. squares =np.array([[1,4,9,16,25]])
  12. squares.shape #要显示的数组为可表示1行5列的向量的数组
  13. #正常显示图示案例
  14. #通过np.squeeze()函数转换后,要显示的数组变成了秩为1的数组,即(5,)
  15. plt.plot(np.squeeze(squares))
  16. plt.show()
  1. 只有单维度删除以后:

python-常见使用技巧 - 图1

生成器

  • 结合if
  • for嵌套 ```python names_list = [“Washington”, “Trump”, “Obama”, “bush”, “Clinton”, “Reagan”]

在表达式中使用if条件

new_names = [name if name.startswith(‘T’) else ‘Not President’ for name in names_list]

print(new_names)

for嵌套

names_list = [“Trump”, “Obama”,”Clinton”]

双重for循环

chars = [c for name in names_list for c in name]

print(chars)

names_list = [“Trump”, “Obama”,”Clinton”]

传统的双层for循环,需要使用4句代码

chars = [] for name in names_list: for c in name: chars.append(c)

print(chars)

  1. 可以减少空间,尽量使用列表内for函数,可以使代码更加优雅,简洁
  2. - 一种高效的方法是只在定义变量时并不立即分配实际内存,只在真正使用变量时才会分配内存,这就是我们的Generator变量
  3. - 在定义Generator变量时只要将原来list的方括号替换成圆括号即可
  4. ```python
  5. #list变量,立即分配实际内存
  6. L1 = [x for x in range(1_000_000)]
  7. #Generator变量,不分配实际内存
  8. L2 = (x for x in range(1_000_000))
  9. print(L1.__sizeof__())
  10. print(L2.__sizeof__())
  11. #list变量
  12. L1 = [ w for w in range(10)]
  13. for i in L1:
  14. print(i)
  15. #替换为生成器变量
  16. L2 = (w for w in range(10))
  17. for i in L2:
  18. print(i)

内置函数如map()、filter(),这些内置函数使用简单,但是存在可读性差,使用for转换

  1. ## map
  2. array = [[16, 3, 7],
  3. [2, 24, 9],
  4. [4, 1, 12]]
  5. row_min = map(min, array)
  6. print(list(row_min))
  7. #替换为
  8. row_min = [min(row) for row in array ]
  9. print(row_min)
  10. ## filter
  11. names_list = ["Trump", "Obama","bush"]
  12. #filter函数
  13. L1 = filter(lambda name: len(name) < 5, names_list)
  14. print(list(L1))
  15. #替换为:
  16. L2 = [name for name in names_list if len(name) < 5]
  17. print(L2)

problems

not callable

使用[],而不是()参见生成器generator