虽然用python用了快半年了,还是有一些小细节没有注意到,现在来回顾一下。
整数和浮点数混合运算,结果为浮点数。
>>> 1.0 + 2
3.0
为什么要区分整数运算和浮点数运算呢?这是因为整数运算的结果永远是精确的,而浮点数运算的结果不一定精确,因为计算机内存再大,也无法精确表示出无限循环小数,比如 0.1 换成二进制表示就是无限循环小数。
python2中:
>>> 11/4
2
>>> 11.0/4 #取浮点数可以得到精确值
2.75
>>> 11%4 #取余数,python3也可用
3
python3中:
>>> 11/4
2.75
>>> int(11/4) #取int才能得到整数值
2
python解释器做布尔运算时,只要能提前确定运算结果,就不会往后算了。
a and b
,如果a是False,则根据运算法则整个结果将返回False,如果a为True,则最终结果取决于b,返回ba or b
,如果a是True,根据运算法则,结果返回a,不在继续运算,如果a为False,则结果取决于b,返回b。python把0
,空字符串''
,None看成是False,把其他字符串和非空字符串看成是True.
如下的例子,生成一个3X2的矩阵。
import numpy as np
a = np.random.randn(3,2)
print(a)
得到:
[[-0.56350499 -0.45242327]
[-0.82237964 0.07284173]
[-0.06029128 -1.28029924]]
如果这个矩阵加一个常数1,这个1会自动变成3X2的矩阵,且每个元素均为1.
b = a + 1
print(b)
得到
[[ 0.43649501 0.54757673]
[ 0.17762036 1.07284173]
[ 0.93970872 -0.28029924]]
这种现象称为广播。
但也经常会因为这样一个性质造成一个小bug。
如下
>>> c = np.random.randn(3)
>>> print(c)
[-0.514756 -0.94212637 -1.08568401] #注意这里只有一个[]
>>> print(c.shape)
(3,)#注意这里
>>> d = np.random.randn(3).reshape(1,3)
>>> print(d)
[[ 0.71364651 -0.07341469 0.56105959]]
>>> print(d.shape)
(1, 3)
>>> print(np.dot(c,d)) #这就是一个小bug
Traceback (most recent call last):
File "" , line 1, in <module>
ValueError: shapes (3,) and (1,3) not aligned: 3 (dim 0) != 1 (dim 0)
>>> c = np.random.randn(3,1) #而这样生成的c是有两个[]的
>>> print(c.shape)
(3, 1) #注意这里
>>> print(c)
[[-1.14870918]
[-0.64108969]
[ 1.28943476]]
>>> print(np.dot(c,d)) #bug解决
[[-0.8197723 0.08433213 -0.64449431]
[-0.45751142 0.0470654 -0.35968952]
[ 0.92020062 -0.09466345 0.72344974]]
如果你不确定向量的维度是多少,可以使用这个确定一下向量的维度是你想要的。
>>> assert(c.shape == (3,1))
>>> assert(c.shape == (1,3))
Traceback (most recent call last):
File "" , line 1, in
AssertionError
或者使用reshape方法来变成你要的维度。