簡體   English   中英

如何在 Python 中將一維數組廣播到 ND 數組

[英]How to broadcast a 1d array to an N-D array in Python

我在這里遺漏了一些東西。 我有一個一維數組,我想廣播到一個 ND 數組,但它不起作用:

>>> import numpy as np
>>> np.broadcast_to(np.arange(12),(12,2,2))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\app\python\anaconda\2\lib\site-packages\numpy\lib\stride_tricks.py", line 173, in broadcast_to
    return _broadcast_to(array, shape, subok=subok, readonly=True)
  File "c:\app\python\anaconda\2\lib\site-packages\numpy\lib\stride_tricks.py", line 128, in _broadcast_to
    op_flags=[op_flag], itershape=shape, order='C').itviews[0]
ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (12,) and requested shape (12,2,2)

解決方案

您需要將最后一個維度的大小作為第一個參數(arange 數組)的大小。 這有效。 只需將 12 放在最后並轉置

import numpy as np
np.broadcast_to(np.arange(12),(2,2,12)).T # so it fits exactly your question, transpose

>>> np.broadcast_to(np.arange(12),(2,2,12)).T.shape
(12, 2, 2)

筆記

查看文檔,似乎您確實需要在兩者上都有相應的形狀 - 數組和所需的形狀。 如果你有

np.arange(X)

那么你可以有任何想要的形狀,只要最后一個維度的形狀是 X

np.broadcast_to(np.arange(X),(ANY,ANY,ANY,ANY,ANY,X))

你可以用這個有趣的例子來測試它

X = 10
np.broadcast_to(np.arange(X),[i for i in range(X+1)]).shape

編輯:

關於@Divakar對 OP評論(添加額外維度),看起來有兩種可能的方法具有相同的結果

solution1 = np.broadcast_to(np.arange(12)[:,None,None], (12,2,2)) # Divakar's
solution2 = np.broadcast_to(np.arange(12),(12,2,2)[::-1]).T # without extra dimensions, using Transpose

>>> np.all(solution1 == solution2)
True

廣播有兩個步驟:

  • 展開左側的尺寸以匹配
  • 展開所有尺寸 1 的尺寸以匹配

對於大小為 (12,) 的數組,第一步可以生成 (1,1,12),但不能生成 (12,1,1)。 第二步可以擴展到(2,2,12)。 但是你想要 (12,2,2)。

所以你必須明確添加尾隨尺寸

In [773]: np.broadcast_to(np.arange(12)[:,None,None], (12,2,2)).shape
Out[773]: (12, 2, 2)

In [775]: np.broadcast_to(np.arange(3)[:,None,None], (3,2,2))
Out[775]: 
array([[[0, 0],
        [0, 0]],

       [[1, 1],
        [1, 1]],

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

因此,通過這些規則廣播到 (2,2,12) 起作用,並且轉置可以將其更改為 (12,2,2)

廣播到 (12,12,12) 相當於擴展 (1,1,12)。 arange是最后一個維度,而不是第一個維度。 我們不想切割最后一個維度

In [777]: np.broadcast_to(np.arange(3),(3,3,3))[:,:2,:2]
Out[777]: 
array([[[0, 1],
        [0, 1]],

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

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

當您廣播到 ND 時,新形狀必須與一維數組的輸入相匹配。 例如,你可以這樣做:

np.broadcast_to(np.arange(12),(12,12))

或者

np.broadcast_to(np.arange(12),(12,12,12))

從您的示例中,它無法將 12 個數字廣播到長度為 2 的維度中。

如果你想要一些你提到的廣播的子集,那么你可以對數組進行切片。

arr = np.broadcast_to(np.arange(12),(12,12,12))
arr = arr[:,:2,:2]

這給出了您想要的所需結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM