有没有好的方法来“扩展”一个核反应堆?假设我有一个这样的房间:
[[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
需要说明的是:没有“好”的方法来扩展NumPy数组,因为NumPy数组是可扩展的。一旦定义了数组,它在内存中所占的空间,即它的元素数量和每个元素大小的组合,是固定的,不能更改。唯一能做的就是创建一个新数组,并用原始数组的元素替换它的一些元素。
很多函数都是为了方便而提供的(函数^{} 和它的} ,索引例程^{} 和
np.*stack
快捷键,^{np.c_
…),但也有一些:方便函数。其中一些是在C级别优化的(我认为,np.concatenate
和其他的),有些不是。请注意,您最初的建议是“手工”创建一个大数组(可能用零填充),然后自己用初始数组填充它,这一点都没有。更复杂的解决方案可能更具可读性。
您可以使用
numpy.pad
,如下所示:这里
np.pad
说,“取数组a
,在它上面加0行,下面加0行,左边加0列,右边加3列。用constant_values
指定的constant
填充这些列。这里有索引技巧
r_
和c_
。如果这是性能关键的代码,您可能更喜欢使用等效的
np.concatenate
,而不是索引技巧。也有
np.resize
和np.ndarray.resize
,但是它们有一些限制(由于numpy在内存中布局数据的方式),所以读取这些文件的docstring。您可能会发现,简单地连接更好。顺便说一句,当我需要这样做的时候,我通常只是按照你已经提到的基本方法来做(创建一个0数组并在其中分配一个较小的数组),我看不出有什么问题!
相关问题 更多 >
编程相关推荐