繁体   English   中英

如何将二维 numpy 数组按元素乘积成 3-d 在后者的第二维上?

[英]How to product element-wise a 2-d numpy array into 3-d over the second dimension of the latter?

我有一个 numpy 矩阵b = np.array([[1,0,1,0],[0,0,0,1]])并且我想将它按元素生成一个 3-dim 数组a = np.array([[[1,2,3,4], [5,6,7,8], [9,10,11,12]], [[13,14,15,16], [17,18,19,20], [21,22,23,24]]])用于第二维上的每个索引。 所以,我期望的结果应该如下:

[[[1,0,3,0], [5,0,7,0], [9,0,11,0]], [[0,0,0,16], [0,0,0,20], [0,0,0,24]]]

如果我做a * b , Numpy 不会广播。 我正在考虑在其第二维中广播 b。 我试过np.broadcast_to(b, (2,3,4))但我得到了错误。 我试过(np.broadcast_to(b, (3,2,4)).reshape(2,3,4))但 output 不如预期。

你需要重塑:

c = b.reshape(2,-1,4)*a

使用None/newaxis添加一个新的中间维度( reshape也这样做):

In [36]: b.shape
Out[36]: (2, 4)
In [37]: a.shape
Out[37]: (2, 3, 4)
In [38]: b[:,None,:]*a
Out[38]: 
array([[[ 1,  0,  3,  0],
        [ 5,  0,  7,  0],
        [ 9,  0, 11,  0]],

       [[ 0,  0,  0, 16],
        [ 0,  0,  0, 20],
        [ 0,  0,  0, 24]]])

In [39]: b[:,None,:].shape
Out[39]: (2, 1, 4)

broadcast_to无法自动添加该额外维度。 它遵循与b*a操作相同的规则。 如果需要,它可以添加前导维度,并缩放大小 1 维度。 但是对于其他任何事情,您都必须明确。

In [41]: np.broadcast_to(b, (2,3,4))
Traceback (most recent call last):
  File "<ipython-input-41-3c3268de7ce1>", line 1, in <module>
    np.broadcast_to(b, (2,3,4))
  File "<__array_function__ internals>", line 5, in broadcast_to
  File "/usr/local/lib/python3.8/dist-packages/numpy/lib/stride_tricks.py", line 411, in broadcast_to
    return _broadcast_to(array, shape, subok=subok, readonly=True)
  File "/usr/local/lib/python3.8/dist-packages/numpy/lib/stride_tricks.py", line 348, in _broadcast_to
    it = np.nditer(
ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (2,4)  and requested shape (2,3,4)

In [42]: np.broadcast_to(b[:,None,:], (2,3,4))
Out[42]: 
array([[[1, 0, 1, 0],
        [1, 0, 1, 0],
        [1, 0, 1, 0]],

       [[0, 0, 0, 1],
        [0, 0, 0, 1],
        [0, 0, 0, 1]]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM