在低维数组中拆分数组的最后一维
Split last dimension of arrays in lower dimensional arrays
假设我们有一个 NxMxD
形状的数组。我想获得一个包含 D
NxM
数组的列表。
正确的做法是:
np.dsplit(myarray, D)
但是,这个returnsD
NxMx1
数组。
我可以通过以下方式达到预期的效果:
[myarray[..., i] for i in range(D)]
或:
[np.squeeze(subarray) for subarray in np.dsplit(myarray, D)]
但是,我觉得需要执行额外的操作有点多余。我是否缺少 returns 所需结果的任何 numpy
函数?
尝试D.swapaxes(1,2).swapaxes(1,0)
>>>import numpy as np
>>>a = np.arange(24).reshape(2,3,4)
>>>a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>>[a[:,:,i] for i in range(4)]
[array([[ 0, 4, 8],
[12, 16, 20]]),
array([[ 1, 5, 9],
[13, 17, 21]]),
array([[ 2, 6, 10],
[14, 18, 22]]),
array([[ 3, 7, 11],
[15, 19, 23]])]
>>>a.swapaxes(1,2).swapaxes(1,0)
array([[[ 0, 4, 8],
[12, 16, 20]],
[[ 1, 5, 9],
[13, 17, 21]],
[[ 2, 6, 10],
[14, 18, 22]],
[[ 3, 7, 11],
[15, 19, 23]]])
编辑:正如 ajcr 所指出的(再次感谢),transpose
命令更方便,因为两个交换可以通过使用
一步完成
D.transpose(2,0,1)
np.dsplit
使用np.array_split
,其核心是:
sub_arys = []
sary = _nx.swapaxes(ary, axis, 0)
for i in range(Nsections):
st = div_points[i]; end = div_points[i+1]
sub_arys.append(_nx.swapaxes(sary[st:end], axis, 0))
和axis=-1
,相当于:
[x[...,i:(i+1)] for i in np.arange(x.shape[-1])] # or
[x[...,[i]] for i in np.arange(x.shape[-1])]
这是单例维度。
所以您的
没有任何问题或效率低下
[x[...,i] for i in np.arange(x.shape[-1])]
实际上在快速测试中,任何使用 dsplit
的速度都很慢。这是一般性成本。所以加上squeeze
相对便宜。
但是通过接受其他答案,看起来您确实在寻找一个正确形状的数组,而不是一个数组列表。对于许多有意义的操作。 split
在子数组沿分割轴有多个'row',甚至是奇数个'rows'.
时更有用
假设我们有一个 NxMxD
形状的数组。我想获得一个包含 D
NxM
数组的列表。
正确的做法是:
np.dsplit(myarray, D)
但是,这个returnsD
NxMx1
数组。
我可以通过以下方式达到预期的效果:
[myarray[..., i] for i in range(D)]
或:
[np.squeeze(subarray) for subarray in np.dsplit(myarray, D)]
但是,我觉得需要执行额外的操作有点多余。我是否缺少 returns 所需结果的任何 numpy
函数?
尝试D.swapaxes(1,2).swapaxes(1,0)
>>>import numpy as np
>>>a = np.arange(24).reshape(2,3,4)
>>>a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>>[a[:,:,i] for i in range(4)]
[array([[ 0, 4, 8],
[12, 16, 20]]),
array([[ 1, 5, 9],
[13, 17, 21]]),
array([[ 2, 6, 10],
[14, 18, 22]]),
array([[ 3, 7, 11],
[15, 19, 23]])]
>>>a.swapaxes(1,2).swapaxes(1,0)
array([[[ 0, 4, 8],
[12, 16, 20]],
[[ 1, 5, 9],
[13, 17, 21]],
[[ 2, 6, 10],
[14, 18, 22]],
[[ 3, 7, 11],
[15, 19, 23]]])
编辑:正如 ajcr 所指出的(再次感谢),transpose
命令更方便,因为两个交换可以通过使用
D.transpose(2,0,1)
np.dsplit
使用np.array_split
,其核心是:
sub_arys = []
sary = _nx.swapaxes(ary, axis, 0)
for i in range(Nsections):
st = div_points[i]; end = div_points[i+1]
sub_arys.append(_nx.swapaxes(sary[st:end], axis, 0))
和axis=-1
,相当于:
[x[...,i:(i+1)] for i in np.arange(x.shape[-1])] # or
[x[...,[i]] for i in np.arange(x.shape[-1])]
这是单例维度。
所以您的
没有任何问题或效率低下[x[...,i] for i in np.arange(x.shape[-1])]
实际上在快速测试中,任何使用 dsplit
的速度都很慢。这是一般性成本。所以加上squeeze
相对便宜。
但是通过接受其他答案,看起来您确实在寻找一个正确形状的数组,而不是一个数组列表。对于许多有意义的操作。 split
在子数组沿分割轴有多个'row',甚至是奇数个'rows'.