基本操作
数组上的算术运算符会应用到 元素 级别。下面是创建一个新数组并填充结果的示例:
>>> a = np.array( [20,30,40,50] ) #array([20, 30, 40, 50])
>>> b = np.arange( 4 ) ## array([0, 1, 2, 3])
加法
上述代码中的 a
和 b
是两个属性为 array 也就是矩阵的变量,而且二者都是1行4列的矩阵, 其中b矩阵中的元素分别是从0到3。 如果我们想要求两个矩阵之间的减法,你可以尝试着输入
c = a + b # array([20, 31, 42, 53])
通过执行上述脚本,将会得到对应元素相减的结果,即[10,31,42,53]
。 同理,矩阵对应元素的相加和相乘也可以用类似的方式表示:
减法
c = a - b #array([20, 29, 38, 47])
乘法
与许多矩阵语言不同,乘积运算符*
在NumPy数组中按元素进行运算。即矩阵/向量对应元素的相乘, 这种乘法被称为’哈达马积’
e.g. 1
c = a * b #array([ 0, 30, 80, 150])
e.g. 2
A = np.array( [[1,1],
... [0,1]] )
B = np.array( [[2,0],
... [3,4]] )
A * B # elementwise product
array([[2, 0],
[0, 4]])
e.g. 3 矩阵中元素乘方
#矩阵中各个元素的乘方
c = b ** 2 #array([0, 1, 4, 9])
矩阵乘积
与许多矩阵语言不同,乘积运算符*
在NumPy数组中按元素进行运算。矩阵乘积可以使用@
运算符(在python> = 3.5中)或dot
函数或方法执行:
>>> A = np.array( [[1,1],
... [0,1]] )
>>> B = np.array( [[2,0],
... [3,4]] )
>>> A * B # elementwise product
array([[2, 0],
[0, 4]])
>>> A @ B # matrix product
array([[5, 4],
[3, 4]])
>>> A.dot(B) # another matrix product
array([[5, 4],
[3, 4]])
>>> ret = np.dot(A,B) # another matrix product
array([[5, 4],
[3, 4]])
其他操作
逻辑判断
>>> a<35
array([ True, True, False, False])
某些操作(例如+=
和 *=
)会更直接更改被操作的矩阵数组而不会创建新矩阵数组。
>>> a = np.ones((2,3), dtype=int)
>>> b = np.random.random((2,3))
>>> a *= 3
>>> a
array([[3, 3, 3],
[3, 3, 3]])
>>> b += a
>>> b
array([[ 3.417022 , 3.72032449, 3.00011437],
[ 3.30233257, 3.14675589, 3.09233859]])
>>> a += b # b is not automatically converted to integer type
Traceback (most recent call last):
...
TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
当使用不同类型的数组进行操作时,结果数组的类型对应于更一般或更精确的数组(称为向上转换的行为)。
>>> a = np.ones(3, dtype=np.int32)
>>> b = np.linspace(0,pi,3)
>>> b.dtype.name
'float64'
>>> c = a+b
>>> c
array([ 1. , 2.57079633, 4.14159265])
>>> c.dtype.name
'float64'
>>> d = np.exp(c*1j)
>>> d
array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,
-0.54030231-0.84147098j])
>>> d.dtype.name
'complex128'