040、数组广播机制
本文最后更新于 68 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com

数组广播机制

import numpy as np

正常的加法:

a = np.array([[ 0, 0, 0],
              [10,10,10],
              [20,20,20],
              [30,30,30]])
b = np.array([[ 0, 1, 2],
              [ 0, 1, 2],
              [ 0, 1, 2],
              [ 0, 1, 2]])
a + b
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

b 的值变成一维的 [0,1,2] 之后的加法:

b = np.array([0,1,2])

a + b
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

结果一样,虽然两个数组的维数不一样,但是 Numpy 检测到 b 的维度与 a 的维度匹配,所以将 b 扩展为之前的形式,得到相同的形状。

对于更高维度,这样的扩展依然有效。

如果我们再将 a 变成一个列向量呢?

a = np.array([0,10,20,30])
a.shape = 4,1
a
array([[ 0],
       [10],
       [20],
       [30]])
b
array([0, 1, 2])
a + b
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

可以看到,虽然两者的维度并不相同,但是Numpy还是根据两者的维度,自动将它们进行扩展然后进行计算。

对于 Numpy 来说,维度匹配当且仅当:

  • 维度相同
  • 有一个的维度是1

匹配会从最后一维开始进行,直到某一个的维度全部匹配为止,因此对于以下情况,Numpy 都会进行相应的匹配:

A B Result
3d array: 256 x 256 x 3 1d array: 3 3d array: 256 x 256 x 3
4d array: 8 x 1 x 6 x 1 3d array: 7 x 1 x 5 3d array: 8 x 7 x 6 x 5
3d array: 5 x 4 x 3 1d array: 1 3d array: 5 x 4 x 3
3d array: 15 x 4 x 13 1d array: 15 x 1 x 13 3d array: 15 x 4 x 13
2d array: 4 x 1 1d array: 3 2d array: 4 x 3

匹配成功后,Numpy 会进行运算得到相应的结果。

当然,如果相应的维度不匹配,那么Numpy会报错:

a = np.array([0,10,20,30])
a.shape
(4L,)
b.shape
(3L,)
a + b
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

 in ()
----> 1 a + b

ValueError: operands could not be broadcast together with shapes (4,) (3,) 

a 转换为列向量,还是可以计算出结果:

a[:, np.newaxis] + b
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

例子

x = np.linspace(-.5,.5, 21)
y = x[:, np.newaxis]
x.shape
(21L,)
y.shape
(21L, 1L)

先形成一个 21 乘 21 的网格,再计算网格到原点的距离:

radius = np.sqrt(x ** 2 + y ** 2)
import matplotlib.pyplot as plt
%matplotlib inline

plt.imshow(radius)


png

谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇