跨 ndarray 的任意一维切片(沿轴的元素)-NumPy
Arbitary 1D slices (elements along an axis) across an ndarray - NumPy
我发现有几个问题与我要问的很接近,但它们差异很大,似乎无法解决我的问题。我正在尝试沿一个轴获取 1d 切片以获得 ndarray。作为 3d 数组的示例
[[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9,10,11],
[12,13,14],
[15,16,17]],
[[18,19,20],
[21,22,23],
[24,25,26]]]
我想要以下一维切片
[0,1,2]
...
[24,25,26]
[0,3,6]
...
[20,23,26]
[0,9,18]
...
[8,17,26]
这实际上等同于以下内容(对于 3d 数组):
ary[i,j,:]
ary[i,:,k]
ary[:,j,k]
我希望将其概括为 n 维数组
(对于二维数组,我们会得到 ary[i,:] 和 ary[:,j],等等)
是否有 numpy 函数可以让我这样做?
编辑:更正了二维索引
我们可以通过一次选择一个轴将其推到最后并重塑来排列轴。我们将利用 ndarray.ndim
泛化为通用 n-dim ndarrays。此外,np.transpose
在这里可以用来排列轴,np.roll
可以用来获得轴的滚动顺序。实施将非常简单,如下所列 -
# a is input ndarray
R = np.arange(a.ndim)
out = [np.transpose(a,np.roll(R,i)).reshape(-1,a.shape[i]) for i in R]
样本运行-
In [403]: a = np.arange(27).reshape(3,3,3)
In [325]: R = np.arange(a.ndim)
In [326]: out = [np.transpose(a,np.roll(R,i)).reshape(-1,a.shape[i]) for i in R]
In [327]: out[0]
Out[327]:
array([[ 0, 1, 2],
[ 3, 4, 5],
...
[24, 25, 26]])
In [328]: out[1]
Out[328]:
array([[ 0, 3, 6],
[ 9, 12, 15],
....
[20, 23, 26]])
In [329]: out[2]
Out[329]:
array([[ 0, 9, 18],
[ 1, 10, 19],
....
[ 8, 17, 26]])
我发现有几个问题与我要问的很接近,但它们差异很大,似乎无法解决我的问题。我正在尝试沿一个轴获取 1d 切片以获得 ndarray。作为 3d 数组的示例
[[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9,10,11],
[12,13,14],
[15,16,17]],
[[18,19,20],
[21,22,23],
[24,25,26]]]
我想要以下一维切片
[0,1,2]
...
[24,25,26]
[0,3,6]
...
[20,23,26]
[0,9,18]
...
[8,17,26]
这实际上等同于以下内容(对于 3d 数组):
ary[i,j,:]
ary[i,:,k]
ary[:,j,k]
我希望将其概括为 n 维数组
(对于二维数组,我们会得到 ary[i,:] 和 ary[:,j],等等)
是否有 numpy 函数可以让我这样做?
编辑:更正了二维索引
我们可以通过一次选择一个轴将其推到最后并重塑来排列轴。我们将利用 ndarray.ndim
泛化为通用 n-dim ndarrays。此外,np.transpose
在这里可以用来排列轴,np.roll
可以用来获得轴的滚动顺序。实施将非常简单,如下所列 -
# a is input ndarray
R = np.arange(a.ndim)
out = [np.transpose(a,np.roll(R,i)).reshape(-1,a.shape[i]) for i in R]
样本运行-
In [403]: a = np.arange(27).reshape(3,3,3)
In [325]: R = np.arange(a.ndim)
In [326]: out = [np.transpose(a,np.roll(R,i)).reshape(-1,a.shape[i]) for i in R]
In [327]: out[0]
Out[327]:
array([[ 0, 1, 2],
[ 3, 4, 5],
...
[24, 25, 26]])
In [328]: out[1]
Out[328]:
array([[ 0, 3, 6],
[ 9, 12, 15],
....
[20, 23, 26]])
In [329]: out[2]
Out[329]:
array([[ 0, 9, 18],
[ 1, 10, 19],
....
[ 8, 17, 26]])