Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否存在作用于现有数组的'np.repeat'?_Python_Numpy - Fatal编程技术网

Python 是否存在作用于现有数组的'np.repeat'?

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()返回一个新数组,而不是对现有数

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

[[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]])