我想生成一个像split(arr,i,j)这样的函数,它将数组arr除以轴i,j

时间:2017-12-07 07:15:16

标签: python numpy

我想生成像split(arr, i, j)这样的函数,它将数组arr除以ij

但我不知道该怎么做。在使用array_split的以下方法中。我不可能只通过将N维数组划分为N-1维数组来获得我们所寻求的二维数组。

import numpy as np

arr = np.arange(36).reshape(4,9)
dim = arr.ndim
ax = np.arange(dim)
arritr = [np.array_split(arr, arr.shape[ax[i]], ax[i]) for i in range(dim)]
print(arritr[0])
print(arritr[1])

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

我相信你想按轴(行,列)切片。这是文档。 https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

arr[1,:] # will return all values at index 1(row index 1)
arr[:,1] # will return all values at column 1

答案 1 :(得分:0)

我在这里猜一点,但听起来你想把数组分成4个块。

In [120]: arr = np.arange(36).reshape(6,6)

In [122]: [arr[:3,:4], arr[:3:,4:], arr[3:, :4], arr[3:,4:]]
Out[122]: 
[array([[ 0,  1,  2,  3],
        [ 6,  7,  8,  9],
        [12, 13, 14, 15]]), 
 array([[ 4,  5],
        [10, 11],
        [16, 17]]), 
 array([[18, 19, 20, 21],
        [24, 25, 26, 27],
        [30, 31, 32, 33]]), 
 array([[22, 23],
        [28, 29],
        [34, 35]])]

不要担心效率问题。 array_split执行相同的切片。检查其代码以验证。

如果您想要更多切片,可以为任何索引组合添加更多arr[i1:i2, j1:j2]

答案 2 :(得分:0)

你在寻找像matlab mat2cell这样的东西吗?然后你可以这样做:

import numpy as np

def ndsplit(a, splits):
    assert len(splits) <= a.ndim
    splits = [np.r_[0, s, m] for s, m in zip(splits, a.shape)]
    return np.frompyfunc(lambda *x: a[tuple(slice(s[i],s[i+1]) for s, i in zip(splits, x))], len(splits), 1)(*np.indices(tuple(len(s) - 1 for s in splits)))

# demo
a = np.arange(56).reshape(7, 8)
print(ndsplit(a, [(2, 4), (1, 5, 6)]))

# [[array([[0],
#        [8]])
#   array([[ 1,  2,  3,  4],
#        [ 9, 10, 11, 12]])
#   array([[ 5],
#        [13]]) array([[ 6,  7],
#        [14, 15]])]
#  [array([[16],
#        [24]])
#   array([[17, 18, 19, 20],
#        [25, 26, 27, 28]])
#   array([[21],
#        [29]]) array([[22, 23],
#        [30, 31]])]
#  [array([[32],
#        [40],
#        [48]])
#   array([[33, 34, 35, 36],
#        [41, 42, 43, 44],
#        [49, 50, 51, 52]])
#   array([[37],
#        [45],
#        [53]])
#   array([[38, 39],
#        [46, 47],
#        [54, 55]])]]