是否有一个作用在现有阵列上的`np.repeat`?

时间:2019-01-09 20:52:26

标签: python numpy

我有一个很大的NumPy数组,我想在循环的每次迭代中填充新数据。数组中填充了沿轴0重复的数据,例如:

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

我知道如何在每次迭代中从头开始创建此数组:

x = np.repeat([[1, 5]], 4, axis=0)

但是,我不想每次都创建一个新数组,因为它是一个非常大的数组(比4x2大得多)。相反,我想使用上面的代码提前创建数组,然后在每次迭代时用新数据填充数组。

但是np.repeat()返回一个新数组,而不是作用于现有数组。是否有np.repeat()的等效项来填充现有数组?

1 个答案:

答案 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数组,该数组始终包含一个唯一的行,并且对任何行进行更改都会对其余行进行更改(因为基础数据仅对应于一行)。请谨慎处理,因为如果您想拥有两个不同的行,则必须做其他事情。