python拾遗

虽然用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解释器做布尔运算时,只要能提前确定运算结果,就不会往后算了。

  • and操作:a and b,如果a是False,则根据运算法则整个结果将返回False,如果a为True,则最终结果取决于b,返回b
  • or操作:a 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方法来变成你要的维度。

你可能感兴趣的:(python)