如何在 Python 中将一个数组中的多列堆叠在一起?
How do I stack multiple columns from one single array on top of each other in Python?
比如数组的形状是5,4。
a = np.random.randint(10, size= (5, 4))
a =
[[1 4 5 0]
[3 1 5 1]
[4 8 0 9]
[8 1 5 8]
[6 4 7 4]]
我希望数组重塑为:
a =
[[1 4]
[3 1]
[4 8]
[8 1]
[6 4]
[5 0]
[5 1]
[0 9]
[5 8]
[7 4]]
我的原始数组大小约为 200 GB,形状为 80000*480600。我曾尝试使用重新映射模式,但速度很慢。
使用numpy.hsplit and numpy.concatenate:-
>>> a = np.random.randint(10, size= (5, 4))
>>> a
array([[8, 5, 8, 9],
[9, 5, 6, 3],
[5, 3, 8, 7],
[9, 0, 9, 9],
[0, 7, 8, 0]])
>>> t = np.hsplit(a, 2)
>>> t
[array([[8, 5],
[9, 5],
[5, 3],
[9, 0],
[0, 7]]), array([[8, 9],
[6, 3],
[8, 7],
[9, 9],
[8, 0]])]
>>> np.concatenate([t[0], t[1]])
array([[8, 5],
[9, 5],
[5, 3],
[9, 0],
[0, 7],
[8, 9],
[6, 3],
[8, 7],
[9, 9],
[8, 0]])
hsplit
和 reshape
也有效
np.reshape(np.hsplit(a, 2), (-1,2))
Out[99]:
array([[1, 4],
[3, 1],
[4, 8],
[8, 1],
[6, 4],
[5, 0],
[5, 1],
[0, 9],
[5, 8],
[7, 4]])
这可以通过重塑和转置(以及最终重塑)来完成
In [195]: arr = np.arange(20).reshape(5,4)
In [196]: arr
Out[196]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
In [197]: arr.reshape(5,2,2)
Out[197]:
array([[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]],
[[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15]],
[[16, 17],
[18, 19]]])
In [198]: arr.reshape(5,2,2).transpose(1,0,2)
Out[198]:
array([[[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13],
[16, 17]],
[[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15],
[18, 19]]])
确定正确的转置(或 swapaxes
)可能需要反复试验。
In [199]: arr.reshape(5,2,2).transpose(1,0,2).reshape(-1,2)
Out[199]:
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13],
[16, 17],
[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15],
[18, 19]])
拆分和连接的等价物:
In [200]: np.concatenate(np.hsplit(arr,2), axis=0)
Out[200]:
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13],
[16, 17],
[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15],
[18, 19]])
转置路由应该更快。
比如数组的形状是5,4。
a = np.random.randint(10, size= (5, 4))
a =
[[1 4 5 0]
[3 1 5 1]
[4 8 0 9]
[8 1 5 8]
[6 4 7 4]]
我希望数组重塑为:
a =
[[1 4]
[3 1]
[4 8]
[8 1]
[6 4]
[5 0]
[5 1]
[0 9]
[5 8]
[7 4]]
我的原始数组大小约为 200 GB,形状为 80000*480600。我曾尝试使用重新映射模式,但速度很慢。
使用numpy.hsplit and numpy.concatenate:-
>>> a = np.random.randint(10, size= (5, 4))
>>> a
array([[8, 5, 8, 9],
[9, 5, 6, 3],
[5, 3, 8, 7],
[9, 0, 9, 9],
[0, 7, 8, 0]])
>>> t = np.hsplit(a, 2)
>>> t
[array([[8, 5],
[9, 5],
[5, 3],
[9, 0],
[0, 7]]), array([[8, 9],
[6, 3],
[8, 7],
[9, 9],
[8, 0]])]
>>> np.concatenate([t[0], t[1]])
array([[8, 5],
[9, 5],
[5, 3],
[9, 0],
[0, 7],
[8, 9],
[6, 3],
[8, 7],
[9, 9],
[8, 0]])
hsplit
和 reshape
也有效
np.reshape(np.hsplit(a, 2), (-1,2))
Out[99]:
array([[1, 4],
[3, 1],
[4, 8],
[8, 1],
[6, 4],
[5, 0],
[5, 1],
[0, 9],
[5, 8],
[7, 4]])
这可以通过重塑和转置(以及最终重塑)来完成
In [195]: arr = np.arange(20).reshape(5,4)
In [196]: arr
Out[196]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
In [197]: arr.reshape(5,2,2)
Out[197]:
array([[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]],
[[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15]],
[[16, 17],
[18, 19]]])
In [198]: arr.reshape(5,2,2).transpose(1,0,2)
Out[198]:
array([[[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13],
[16, 17]],
[[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15],
[18, 19]]])
确定正确的转置(或 swapaxes
)可能需要反复试验。
In [199]: arr.reshape(5,2,2).transpose(1,0,2).reshape(-1,2)
Out[199]:
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13],
[16, 17],
[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15],
[18, 19]])
拆分和连接的等价物:
In [200]: np.concatenate(np.hsplit(arr,2), axis=0)
Out[200]:
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13],
[16, 17],
[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15],
[18, 19]])
转置路由应该更快。