强制类型转换
>>> a=np.array([1.1, 1.2])
>>> a.dtype
dtype('float64')
>>> a.dtype=np.int16
>>> a.dtype
dtype('int16')
>>> a
array([-26214, -26215, -26215, 16369, 13107, 13107, 13107, 16371], dtype=int16)
#原来float64相当于4个int16的位宽,这样强制转换后会将他们直接拆开成4个数,
#因此原来的两个float64成了8个int16
>>> a=np.array([1.1, 1.2])
>>> a.dtype
dtype('float64')
>>> a.astype(np.int16)
array([1, 1], dtype=int16)
>>> a.dtype
dtype('float64') #a的数据类型并没有变
>>> a=a.astype(np.int16) #赋值操作后a的数据类型变化
>>> a
array([1, 1], dtype=int16)
# 使用赋值法才可以对数据转换astype
# dtype查看数据类型
>>> float(b)#直接解决问题...
函数
floor:
向下取整
>>> a
array([-1.7, -1.5, -0.2, 0.2, 1.5, 1.7, 2. ])
>>>
>>> np.floor(a)
array([-2., -2., -1., 0., 1., 1., 2.])
zeros:
np.zeros((a,b))#两个括号
squeeze:
- 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)a表示输入的数组;
2)axis用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;
3)axis的取值可为None 或 int 或 tuple of ints, 可选。若axis为空,则删除所有单维度的条目;
4)返回值:数组
5) 不会修改原数组;
# 绘图
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
#无法正常显示图示案例
squares =np.array([[1,4,9,16,25]])
squares.shape #要显示的数组为可表示1行5列的向量的数组
#正常显示图示案例
#通过np.squeeze()函数转换后,要显示的数组变成了秩为1的数组,即(5,)
plt.plot(np.squeeze(squares))
plt.show()
- 只有单维度删除以后:
生成器
- 结合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)
可以减少空间,尽量使用列表内for函数,可以使代码更加优雅,简洁
- 一种高效的方法是只在定义变量时并不立即分配实际内存,只在真正使用变量时才会分配内存,这就是我们的Generator变量
- 在定义Generator变量时只要将原来list的方括号替换成圆括号即可
```python
#list变量,立即分配实际内存
L1 = [x for x in range(1_000_000)]
#Generator变量,不分配实际内存
L2 = (x for x in range(1_000_000))
print(L1.__sizeof__())
print(L2.__sizeof__())
#list变量
L1 = [ w for w in range(10)]
for i in L1:
print(i)
#替换为生成器变量
L2 = (w for w in range(10))
for i in L2:
print(i)
内置函数如map()、filter(),这些内置函数使用简单,但是存在可读性差,使用for转换
## map
array = [[16, 3, 7],
[2, 24, 9],
[4, 1, 12]]
row_min = map(min, array)
print(list(row_min))
#替换为
row_min = [min(row) for row in array ]
print(row_min)
## filter
names_list = ["Trump", "Obama","bush"]
#filter函数
L1 = filter(lambda name: len(name) < 5, names_list)
print(list(L1))
#替换为:
L2 = [name for name in names_list if len(name) < 5]
print(L2)
problems
not callable
使用[],而不是()参见生成器generator