Python 是否存在作用于现有数组的'np.repeat'?
我有一个大的NumPy数组,我想在循环的每次迭代中用新数据填充它。阵列中填充了沿轴0重复的数据,例如:Python 是否存在作用于现有数组的'np.repeat'?,python,numpy,Python,Numpy,我有一个大的NumPy数组,我想在循环的每次迭代中用新数据填充它。阵列中填充了沿轴0重复的数据,例如: [[1, 5], [1, 5], [1, 5], [1, 5]] 我知道如何在每次迭代中从头开始创建此阵列: x = np.repeat([[1, 5]], 4, axis=0) 但是,我不想每次都创建一个新阵列,因为它是一个非常大的阵列(比4x2大得多)。相反,我想使用上面的代码提前创建数组,然后在每次迭代中用新数据填充数组 但是np.repeat()返回一个新数组,而不是对现有数
[[1, 5],
[1, 5],
[1, 5],
[1, 5]]
我知道如何在每次迭代中从头开始创建此阵列:
x = np.repeat([[1, 5]], 4, axis=0)
但是,我不想每次都创建一个新阵列,因为它是一个非常大的阵列(比4x2大得多)。相反,我想使用上面的代码提前创建数组,然后在每次迭代中用新数据填充数组
但是
np.repeat()
返回一个新数组,而不是对现有数组执行操作。填充现有数组是否有一个与np.repeat()
等效的方法?正如我们在评论中所指出的,您可以使用广播分配来使用适当大小的1d数组填充2d数组:
x[...] = [1, 5]
如果您的大数组在每一行中总是包含相同的项(即,您以后不会更改这些预设值),您几乎可以肯定地在代码的后面部分使用广播,只需使用初始的x
,例如
x = np.array([[1, 5]])
此数组具有shape(1,2)
,该数组与上述示例中可能具有的其他shape(4,2)
数组广播兼容
如果每行中始终需要相同的值,并且由于某些原因无法使用广播(这两种情况都不太可能),则可以使用broadcast\u to
创建具有显式2d形状的数组,而无需复制内存:
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)
但是,您不能对其进行修改,因为它是只读视图:
>>> 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
这将为您提供一个固定形状的二维数组,该数组始终包含一个唯一的行,而对任何行进行变异都会对其余行进行变异(因为基础数据只对应于一行)。小心处理,因为如果你想要有两个不同的行,你必须做其他事情。难道不是
x[…]=[1,5]
做你想做的吗?非常大的数组仍然是二维数组,你想用相同的一维数组填充每一行吗?如果是这样,您可以执行,例如,x[:]=[2,6]
。将[2,6]
复制到每一行。
>>> x_in = np.array([1, 5])
... x_strided = np.lib.stride_tricks.as_strided(x_in, shape=(4,) + x_in.shape,
... strides=(0,) + x_in.strides[-1:])
>>> x_strided
array([[1, 5],
[1, 5],
[1, 5],
[1, 5]])
>>> x_strided[0, :] = [2, 4]
>>> x_strided
array([[2, 4],
[2, 4],
[2, 4],
[2, 4]])