在numpy数组中一次访问块

时间:2018-08-09 12:58:31

标签: python arrays python-3.x numpy

提供了一个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 在这里有帮助吗?

2 个答案:

答案 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]])