提供了一个numpy数组:
arr = np.array([0,1,2,3,4,5,6,7,8,9,10,11,12])
我想知道如何访问选定大小的块以及选定的分隔,包括串联和切片:
例如:获取大小为3的块,并用两个值分隔:
arr_chunk_3_sep_2 = np.array([0,1,2,5,6,7,10,11,12])
arr_chunk_3_sep_2_in_slices = np.array([[0,1,2],[5,6,7],[10,11,12])
哪种方法最有效?如果可能的话,我想避免复制或创建新对象。也许 Memoryviews 在这里有帮助吗?
答案 0 :(得分:3)
方法1
这里是private GameObject SpawnEntity(GameObject p, Vector2 coords)
{
Gameobject myobj = Instantiate(p);
...
myobj.transform.position = coords;
return myobj;
}
-
masking
样品运行-
def slice_grps(a, chunk, sep):
N = chunk + sep
return a[np.arange(len(a))%N < chunk]
方法2
如果输入数组使得最后一块具有足够的跑道,我们可以利用np.lib.stride_tricks.as_strided
,受this post
的启发,从{的每个块中选择In [223]: arr
Out[223]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
In [224]: slice_grps(arr, chunk=3, sep=2)
Out[224]: array([ 0, 1, 2, 5, 6, 7, 10, 11, 12])
个元素{1}}个元素-
m
请注意,输出将是输入数组的视图,因此不会产生额外的内存开销,并且实际上是免费的!
运行样本以使事情变得清晰-
n
答案 1 :(得分:1)
如何重塑和切片?
In [444]: arr = np.array([0,1,2,3,4,5,6,7,8,9,10,11,12])
In [445]: arr.reshape(-1,5)
...
ValueError: cannot reshape array of size 13 into shape (5)
一个问题-您的数组不足以进行此重塑-因此我们必须进行填充:
In [446]: np.concatenate((arr,np.zeros(2,int))).reshape(-1,5)
Out[446]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 0, 0]])
In [447]: np.concatenate((arr,np.zeros(2,int))).reshape(-1,5)[:,:-2]
Out[447]:
array([[ 0, 1, 2],
[ 5, 6, 7],
[10, 11, 12]])
as_strided
可以通过在数据缓冲区之外包含字节来解决此问题。通常,这被视为一个错误,尽管在这里它可以是一种资产-只要您确实确实将那些垃圾扔掉。
或者丢掉最后一个不完整的行:
In [452]: arr[:-3].reshape(-1,5)[:,:3]
Out[452]:
array([[0, 1, 2],
[5, 6, 7]])