我需要hstacking具有相同行数的多个数组(尽管行数在使用之间是可变的)但是列数不同。但是,某些阵列只有一列,例如
array = np.array([1,2,3,4,5])
给出了
#array.shape = (5,)
但我希望将形状识别为2d数组,例如
#array.shape = (5,1)
因此hstack实际上可以将它们组合在一起。 我目前的解决方案是:
array = np.atleast_2d([1,2,3,4,5]).T
#array.shape = (5,1)
所以我想知道,有更好的方法吗?将
array = np.array([1,2,3,4,5]).reshape(len([1,2,3,4,5]), 1)
好吗?
请注意,我对[1,2,3,4,5]的使用只是一个玩具清单,以使示例具体。在实践中,它将是一个更大的列表,作为参数传递给函数。谢谢!
答案 0 :(得分:5)
检查hstack
和vstack
的代码。其中一个或两个都通过atleast_nd
传递参数。这是重塑数组的完全可接受的方式。
其他一些方式:
arr = np.array([1,2,3,4,5]).reshape(-1,1) # saves the use of len()
arr = np.array([1,2,3,4,5])[:,None] # adds a new dim at end
np.array([1,2,3],ndmin=2).T # used by column_stack
hstack
和vstack
将输入转换为:
arrs = [atleast_1d(_m) for _m in tup]
[atleast_2d(_m) for _m in tup]
测试数据:
a1=np.arange(2)
a2=np.arange(10).reshape(2,5)
a3=np.arange(8).reshape(2,4)
np.hstack([a1.reshape(-1,1),a2,a3])
np.hstack([a1[:,None],a2,a3])
np.column_stack([a1,a2,a3])
结果:
array([[0, 0, 1, 2, 3, 4, 0, 1, 2, 3],
[1, 5, 6, 7, 8, 9, 4, 5, 6, 7]])
如果您事先并不知道哪个数组是1d,那么column_stack
最容易使用。其他人需要一些功能,在应用重塑之前测试维度。
答案 1 :(得分:1)
如果我理解你的意图,你希望将形状数组(N,)转换为形状数组(N,1),以便你可以应用np.hstack
:
In [147]: np.hstack([np.atleast_2d([1,2,3,4,5]).T, np.atleast_2d([1,2,3,4,5]).T])
Out[147]:
array([[1, 1],
[2, 2],
[3, 3],
[4, 4],
[5, 5]])
在这种情况下,您可以使用避免重新整形数组并改为使用np.column_stack
:
In [151]: np.column_stack([[1,2,3,4,5], [1,2,3,4,5]])
Out[151]:
array([[1, 1],
[2, 2],
[3, 3],
[4, 4],
[5, 5]])
答案 2 :(得分:1)
我跟随Ludo的工作,只是将v的大小从5更改为10000。我在PC上运行了代码,结果表明atleast_2d在较大规模的情况下似乎是一种更有效的方法。
import numpy as np
import timeit
v = np.arange(10000)
print('atleast2d:',timeit.timeit(lambda:np.atleast_2d(v).T))
print('reshape:',timeit.timeit(lambda:np.array(v).reshape(-1,1))) # saves the use of len()
print('v[:,None]:', timeit.timeit(lambda:np.array(v)[:,None])) # adds a new dim at end
print('np.array(v,ndmin=2).T:', timeit.timeit(lambda:np.array(v,ndmin=2).T)) # used by column_stack
结果是:
atleast2d: 1.3809496470021259
reshape: 27.099974197000847
v[:,None]: 28.58291715100131
np.array(v,ndmin=2).T: 30.141663907001202
我的建议是在处理短向量时使用[:None],而当向量变长时使用np.atleast_2d。
答案 3 :(得分:0)
只是添加关于hpaulj答案的信息。我很好奇四种方法描述的速度有多快。获胜者是在1d数组末尾添加列的方法。
这是我跑的:
import numpy as np
import timeit
v = [1,2,3,4,5]
print('atleast2d:',timeit.timeit(lambda:np.atleast_2d(v).T))
print('reshape:',timeit.timeit(lambda:np.array(v).reshape(-1,1))) # saves the use of len()
print('v[:,None]:', timeit.timeit(lambda:np.array(v)[:,None])) # adds a new dim at end
print('np.array(v,ndmin=2).T:', timeit.timeit(lambda:np.array(v,ndmin=2).T)) # used by column_stack
结果:
atleast2d: 4.455070924214851
reshape: 2.0535152913971615
v[:,None]: 1.8387219828073285
np.array(v,ndmin=2).T: 3.1735243063353664