社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python-在具有相同“外部”大小的数组之间广播

Notso • 5 年前 • 1593 次点击  

在我看来,numpy似乎对广播阵列有一些非故意的行为。假设我们有两个数组

a = numpy.ones((2,2,3))
b = numpy.array([[1],[2]])

我希望能够将这些值相乘,输出为

>>> a*b
array([[[1., 1., 1.],
        [1., 1., 1.]],

       [[2., 2., 2.],
        [2., 2., 2.]]])

但是我们得到

>>> a*b
array([[[1., 1., 1.],
        [2., 2., 2.]],

       [[1., 1., 1.],
        [2., 2., 2.]]])

事实上,这个乘法只起作用,因为 第二 尺寸 a 外面的 尺寸 b (2,在这种情况下)。如果有的话 a = numpy.ones((2,3,3)) ,我得到以下错误:

>>> a*b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3,3) (2,1)

我发现这很奇怪的原因是,将形状(3,4)和(1,)的数组一起广播会很好地工作-那么,当它们是两个较大数组的“子数组”时,为什么不工作呢?

做我想做的事最‘蟒蛇’的方式是什么?具体地说,这是为了创建一个三维数组,其中每个二维子数组在整个过程中都有不同的值。显然,我可以用一个循环,但它看起来并不优雅。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38894
 
1593 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Khalil Al Hooti
Reply   •   1 楼
Khalil Al Hooti    6 年前

怎么样?

a = np.ones((2,2,3))
b = np.array([[[1],
              [1]],
               [[2],
              [2]]])

print(a*b)


array([[[1., 1., 1.],
        [1., 1., 1.]],

       [[2., 2., 2.],
        [2., 2., 2.]]])
hpaulj
Reply   •   2 楼
hpaulj    6 年前

你有一个(2,2,3)和一个(2,1)。第二个扩展到(1,2,1)(前面的自动新轴),然后扩展到(2,2,3)。

尝试 b[:,:,None] 使之(2,1,1)。