Python broadcasting - Numpy的一些东西 - 矩阵之间的运算

 矩阵的运算

import numpy as np
A = np.array([[56.0, 0.0, 4.4, 68.0],
              [1.2, 104.0, 52.0, 8.0],
              [1.8, 135.0, 99.0, 0.9]])
print(A)
print()

cal = A.sum(axis=0)
print(cal)
print()

cal1 = A.sum(axis=1)
print(cal1)
print()

percentage = 100*A/cal.reshape(1, 4)
print(percentage)


运行结果为:

[[ 56.    0.    4.4  68. ]
 [  1.2 104.   52.    8. ]
 [  1.8 135.   99.    0.9]]

[ 59.  239.  155.4  76.9]

[128.4 165.2 236.7]

[[94.91525424  0.          2.83140283 88.42652796]
 [ 2.03389831 43.51464435 33.46203346 10.40312094]
 [ 3.05084746 56.48535565 63.70656371  1.17035111]]

  • 注: 
  1.  A.sum(axis=0)  中 axis = 0 的时候是列求和,axis = 1 的时候是行求和
  2.  cal.reshape(1, 4) 中的reshape用来确保是矩阵的维度, 也可以直接用 A/cal。 reshape消耗常量的时间,时间复杂度是O(1),调用成本很低,所以完全不用担心会消耗大量的时间。
  3. A 是一个 3 *4 的矩阵,而 cal 是一个1 *4的矩阵,两个矩阵怎么相除呢?
[ 59.  239.  155.4  76.9]  --- >  [[ 59.  239.  155.4  76.9]
                                   [ 59.  239.  155.4  76.9]
                                   [ 59.  239.  155.4  76.9]]
  •   Python会将后者进行复制,复制了2次,变成了 3 *4的矩阵,就可以按位相除了。
  • 对于 Python 中两个矩阵的 + - * / 都是这样的运算规则:假如 A 矩阵是 m * n 的,B矩阵是 1 * n 的(或者n * 1),Python会将后者复制成 m * n 的矩阵,然后再按位进行运算。
  • (这属于Python broadcasting的功能,感兴趣的可以看 numpy 文档)


 np.random.randn(5)

import numpy as np

# 生成五个高斯随机数,并存储在数组A中
A = np.random.randn(5)
print(A)

print(A.shape)
print(A.T)

print(np.dot(A, A.T))

运行结果

[ 0.25158475  2.07597532 -1.29149311  0.97915037  0.81086473]
(5,)
[ 0.25158475  2.07597532 -1.29149311  0.97915037  0.81086473]
7.657159909896855
  • 注:
  1. A是一个一维数组
  2. 输出结果 (5,) ,这在Python 中代表秩为 1 的数组,A既不是行向量,也不是列向量
  3. 如果 A 是列向量或者是行向量,则 np.doc(A, A.T) 得到的就是一个矩阵

 np.random.randn(5, 1)

import numpy as np

# 生成 5 * 1 的列向量
A = np.random.randn(5, 1)
print(A)
print()
print(A.shape)
print(A.T)
print()
print(np.dot(A, A.T))

运行结果:

[[-1.07495378]
 [ 1.03389999]
 [-1.43629909]
 [-1.50198387]
 [ 3.10399316]]

(5, 1)
[[-1.07495378  1.03389999 -1.43629909 -1.50198387  3.10399316]]

[[ 1.15552562 -1.11139469  1.54395514  1.61456323 -3.33664916]
 [-1.11139469  1.06894918 -1.48498961 -1.5529011   3.20921848]
 [ 1.54395514 -1.48498961  2.06295509  2.15729807 -4.45826256]
 [ 1.61456323 -1.5529011   2.15729807  2.25595555 -4.66214765]
 [-3.33664916  3.20921848 -4.45826256 -4.66214765  9.63477351]]
  1. A 是一个 5 * 1 的列向量,是一个矩阵
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值