import numpy as np
def resize(a, new_shape):
"""I did some minor changes so it all works with just `import numpy as np`."""
if isinstance(new_shape, (int, np.core.numerictypes.integer)):
new_shape = (new_shape,)
a = np.ravel(a)
Na = len(a)
if not Na:
return np.zeros(new_shape, a.dtype)
total_size = np.multiply.reduce(new_shape)
n_copies = int(total_size / Na)
extra = total_size % Na
if total_size == 0:
return a[:0]
if extra != 0:
n_copies = n_copies+1
extra = Na-extra
a = np.concatenate((a,)*n_copies)
if extra > 0:
a = a[:-extra]
return np.reshape(a, new_shape)
numpy.resize
是pure python function:如果你自己实现这个数组,你就可以直接向前。不幸的是,对于ND数组来说要复杂得多,因为nopython numba函数中不支持某些操作:
^{pr2}$isinstance
,reshape
和元组乘法。以下是1D等效值:如果您不希望“重复输入”行为,而只将其用于增大大小,则更容易:
这些函数用
numba.njit
修饰,因此可以在nopython模式下的任何numba函数中调用。在不过,需要注意的是:一般情况下,您不想调整大小,或者如果您想调整大小,请确保您选择的方法具有amoritzed ^{} cost (Wikipedia link) 。如果您可以估计最大长度,那么最好立即预先分配一个大小正确(或稍微过度分配)的数组。在
通常,我采用的策略是只分配足够多的数组存储来容纳计算,然后跟踪最终使用的索引,然后在返回之前将数组切片到实际大小。这假设您事先知道数组可能增长到的最大大小。我的想法是,在我自己的大多数应用程序中,内存很便宜,但是调整大小和在python和jitted函数之间切换的开销很大。在
相关问题 更多 >
编程相关推荐