我有一个很大的NumPy数组,我想在循环的每次迭代中填充新数据。数组中填充了沿轴0重复的数据,例如:
[[1, 5],
[1, 5],
[1, 5],
[1, 5]]
我知道如何在每次迭代中从头开始创建此数组:
x = np.repeat([[1, 5]], 4, axis=0)
但是,我不想每次都创建一个新数组,因为它是一个非常大的数组(比4x2大得多)。相反,我想使用上面的代码提前创建数组,然后在每次迭代时用新数据填充数组。
但是np.repeat()
返回一个新数组,而不是作用于现有数组。是否有np.repeat()
的等效项来填充现有数组?
答案 0 :(得分:5)
正如我们在评论中指出的那样,您可以使用广播分配以适当尺寸的1d数组填充2d数组:
x[...] = [1, 5]
如果您的大型数组在每行中总是包含相同的项目(即以后不再更改这些预设值),则几乎可以肯定地在代码的后续部分中使用广播,而只需使用{ {1}},例如
x
此数组的形状为x = np.array([[1, 5]])
,与上面示例中的其他形状为(1, 2)
的数组广播兼容。
如果由于某些原因您总是需要在每行和中使用相同的值,则您将无法使用广播(两种情况都不太可能),则可以使用(4, 2)
创建一个数组具有明确的2D形状而不复制内存:
broadcast_to
这可能有用,因为它的形状正确,内存中只有2个唯一元素:
x_bc = np.broadcast_to([1, 5], (4, 2)) # broadcast 1d [1, 5] to shape (4, 2)
但是您不能对其进行突变,因为它是只读视图:
>>> x_bc
array([[1, 5],
[1, 5],
[1, 5],
[1, 5]])
>>> x_bc.strides
(0, 8)
因此,如果您只需要在每行和中使用相同的值,就不能使用广播和,而以后要更改这些相同的行,则可以使用{ {3}}将相同的1d数据映射到2d数组:
>>> x_bc[0, :] = [2, 4]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-35-ae12ecfe3c5e> in <module>
----> 1 x_bc[0, :] = [2, 4]
ValueError: assignment destination is read-only
这将为您提供固定形状的2d数组,该数组始终包含一个唯一的行,并且对任何行进行更改都会对其余行进行更改(因为基础数据仅对应于一行)。请谨慎处理,因为如果您想拥有两个不同的行,则必须做其他事情。