好方法来“扩展”一个新秩序?

2024-05-12 15:59:17 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有好的方法来“扩展”一个核反应堆?假设我有一个这样的房间:

[[1 2]
 [3 4]]

我希望每一行通过填充零来包含更多的元素:

[[1 2 0 0 0]
 [3 4 0 0 0]]

我知道一定有一些暴力的方法来做到这一点(比如用0构造一个更大的数组,然后从旧的更小数组复制元素),只是想知道有没有Python的方法来做到这一点。尝试了numpy.reshape但没有成功:

import numpy as np
a = np.array([[1, 2], [3, 4]])
np.reshape(a, (2, 5))

努比抱怨说:ValueError: total size of new array must be unchanged


Tags: of方法importnumpy元素sizeasnp
3条回答

需要说明的是:没有“好”的方法来扩展NumPy数组,因为NumPy数组是可扩展的。一旦定义了数组,它在内存中所占的空间,即它的元素数量和每个元素大小的组合,是固定的,不能更改。唯一能做的就是创建一个新数组,并用原始数组的元素替换它的一些元素。

很多函数都是为了方便而提供的(函数^{}和它的np.*stack快捷键,^{},索引例程^{}np.c_…),但也有一些:方便函数。其中一些是在C级别优化的(我认为,np.concatenate和其他的),有些不是。

请注意,您最初的建议是“手工”创建一个大数组(可能用零填充),然后自己用初始数组填充它,这一点都没有。更复杂的解决方案可能更具可读性。

您可以使用numpy.pad,如下所示:

>>> import numpy as np
>>> a=[[1,2],[3,4]]
>>> np.pad(a, ((0,0),(0,3)), mode='constant', constant_values=0)
array([[1, 2, 0, 0, 0],
       [3, 4, 0, 0, 0]])

这里np.pad说,“取数组a,在它上面加0行,下面加0行,左边加0列,右边加3列。用constant_values指定的constant填充这些列。

这里有索引技巧r_c_

>>> import numpy as np
>>> a = np.array([[1, 2], [3, 4]])
>>> z = np.zeros((2, 3), dtype=a.dtype)
>>> np.c_[a, z]
array([[1, 2, 0, 0, 0],
       [3, 4, 0, 0, 0]])

如果这是性能关键的代码,您可能更喜欢使用等效的np.concatenate,而不是索引技巧。

>>> np.concatenate((a,z), axis=1)
array([[1, 2, 0, 0, 0],
       [3, 4, 0, 0, 0]])

也有np.resizenp.ndarray.resize,但是它们有一些限制(由于numpy在内存中布局数据的方式),所以读取这些文件的docstring。您可能会发现,简单地连接更好。

顺便说一句,当我需要这样做的时候,我通常只是按照你已经提到的基本方法来做(创建一个0数组并在其中分配一个较小的数组),我看不出有什么问题!

相关问题 更多 >