如何在pandas/numpy中将一系列数组转换为单个矩阵?

38

以下代码中的s是包含多个数组的pandas.Series对象。

data = [[1,2,3],[2,3,4],[3,4,5],[2,3,4],[3,4,5],[2,3,4],
        [3,4,5],[2,3,4],[3,4,5],[2,3,4],[3,4,5]]
s = pd.Series(data = data)
s.shape # output ---> (11L,)
# try to convert s to matrix
sm = s.as_matrix()
# but...
sm.shape # output ---> (11L,)

我该如何将s转换为形状为(11,3)的矩阵?谢谢!


你为什么要遍历一个序列呢?如果你需要的是一个矩阵,为什么不直接进行转换呢? - juanpa.arrivillaga
1
那么 import numpy as np; np.array(data) 怎么样?你可能不需要创建一个 Series。另外,注意 (11,3) 维度最好用 DataFrame 表示。 - Abdou
而且你的系列包含列表,而不是数组。 - juanpa.arrivillaga
1
@Abdou,你甚至不需要使用reshape,只需使用np.array(data)即可。 - juanpa.arrivillaga
4个回答

52

另一种方法是提取您的序列的值并在它们上使用numpy.stack。

np.stack(s.values)

顺便说一句,我经常遇到类似的情况。


3
这个。请相信这就是答案。 - Ignacio Peletier
1
这是正确的方法。其他方法在一台750GB内存的计算机上已经耗尽了内存。 - rjurney
适用于以系列方式附加的多维数组 (1000,) -> (1000, 128, 128, 3)。 - DevX

29

如果由于某些原因,你发现自己手头有一个可怕的 Series 对象,将其转换成所需的 matrixarray 相对比较简单:

In [16]: s
Out[16]:
0     [1, 2, 3]
1     [2, 3, 4]
2     [3, 4, 5]
3     [2, 3, 4]
4     [3, 4, 5]
5     [2, 3, 4]
6     [3, 4, 5]
7     [2, 3, 4]
8     [3, 4, 5]
9     [2, 3, 4]
10    [3, 4, 5]
dtype: object

In [17]: sm = np.array(s.tolist())

In [18]: sm
Out[18]:
array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [2, 3, 4],
       [3, 4, 5],
       [2, 3, 4],
       [3, 4, 5],
       [2, 3, 4],
       [3, 4, 5],
       [2, 3, 4],
       [3, 4, 5]])

In [19]: sm.shape
Out[19]: (11, 3)

但是,除非它是你无法改变的东西,否则拥有那个系列一开始就没有什么意义。


谢谢,我有一个Pandas系列,它是一系列行,这帮助我将其从(m,1)转换为正确的数组维度(m,n)。 - DevX

2

我测试了5793个100D向量的上述方法。旧方法,先转换为列表,速度最快。

%time print(np.stack(df.features.values).shape)
%time print(np.stack(df.features.to_numpy()).shape)
%time print(np.array(df.features.tolist()).shape)
%time print(np.array(list(df.features)).shape)

结果

(5793, 100)
CPU times: user 11.7 ms, sys: 3.42 ms, total: 15.1 ms
Wall time: 22.7 ms
(5793, 100)
CPU times: user 11.1 ms, sys: 137 µs, total: 11.3 ms
Wall time: 11.9 ms
(5793, 100)
CPU times: user 5.96 ms, sys: 0 ns, total: 5.96 ms
Wall time: 6.91 ms
(5793, 100)
CPU times: user 5.74 ms, sys: 0 ns, total: 5.74 ms
Wall time: 6.43 ms

1

对于 pandas>=0.24 版本,你也可以使用 np.stack(s.to_numpy()) 或者 np.concatenate(s.to_numpy()),具体取决于你的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接