Numpy:获取1D数组作为2D数组,而不改变形状

2024-07-02 04:48:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要hstacking multple数组,它具有相同的行数(尽管行数在不同的用法之间是可变的),但列数不同。但是有些数组只有一列,例如

array = np.array([1,2,3,4,5])

它给予

#array.shape = (5,)

但我想把这个形状识别为二维数组

#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]的使用只是一个玩具列表,使示例具体化。实际上,它将是一个更大的列表,作为参数传递到函数中。谢谢!


Tags: 方法用法列表lennp数组解决方案array
3条回答

如果我正确理解您的意图,您希望将形状数组(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]])

在这种情况下,可以使用避免改变数组的形状,而使用^{}代替:

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]])

只是想补充一下帕吉的回答。我很好奇这四种方法描述得有多快。获胜者是在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

检查hstackvstack的代码。其中一个或两个,通过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

hstackvstack将它们的输入转换为:

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是最容易使用的。另一些则需要一个小函数,在应用整形之前测试维度。

Numpy: use reshape or newaxis to add dimensions

相关问题 更多 >