将numpy数组中的子数组转换为二维数组

50

我有一个名为features的pandas系列,其包含以下数值 (features.values)。

Translated:

I have a pandas series features that has the following values (features.values)

array([array([0, 0, 0, ..., 0, 0, 0]), array([0, 0, 0, ..., 0, 0, 0]),
       array([0, 0, 0, ..., 0, 0, 0]), ...,
       array([0, 0, 0, ..., 0, 0, 0]), array([0, 0, 0, ..., 0, 0, 0]),
       array([0, 0, 0, ..., 0, 0, 0])], dtype=object)

现在我真的希望这被认为是矩阵,但如果我这样做

>>> features.values.shape
(10000,)

我希望得到的是(10000, 3000)这样的二维数组,而不是一维数组里嵌套数组的格式。为什么它没有自动识别为二维数组呢?


可能重复:https://dev59.com/taDha4cB1Zd3GeqP_i5o - anishtain4
6
尝试使用np.stack(features),它将数组视为一组数组,并在新轴上连接它们。在这种情况下,np.vstack(features)也可以使用。前提是所有内部数组的形状都相同。 - hpaulj
1
@anishtain4,你的链接是针对pandas数据框架,而不是numpy数组。 - hpaulj
@hpaulj "我有一个Pandas系列" - anishtain4
@hpaulj np.stack 表现很棒。只是真的不明白为什么 features.values 不会将其返回,或者为什么 numpy 不将其识别为 2d 数组。谢谢! - Nate Stemen
对象数据类型是一个障碍。外部数组具有指向内存中其他数组的指针。它的结构与二维数组不同。 - hpaulj
2个回答

56

回应您的评论问题,让我们比较两种创建数组的方法

首先,从一个数组列表中创建一个数组(所有数组长度相同):

In [302]: arr = np.array([np.arange(3), np.arange(1,4), np.arange(10,13)])
In [303]: arr
Out[303]: 
array([[ 0,  1,  2],
       [ 1,  2,  3],
       [10, 11, 12]])

结果是一个由数字组成的二维数组。

如果我们使用对象dtype数组,并用数组填充它:

In [304]: arr = np.empty(3,object)
In [305]: arr[:] = [np.arange(3), np.arange(1,4), np.arange(10,13)]
In [306]: arr
Out[306]: 
array([array([0, 1, 2]), array([1, 2, 3]), array([10, 11, 12])],
      dtype=object)

请注意,这个显示跟你的一样。设计上,它是一个一维数组。就像一个列表,它包含指向内存中其他数组的指针。请注意,这需要额外的构建步骤。np.array 的默认行为是尽可能创建多维数组。

需要额外的努力来解决这个问题。同样,要撤消这个操作也需要一些额外的努力 - 创建二维数值数组。

仅仅调用np.array 不会改变数据结构。

In [307]: np.array(arr)
Out[307]: 
array([array([0, 1, 2]), array([1, 2, 3]), array([10, 11, 12])],
      dtype=object)

stack会将其转换成2D数组。它会将其视为一个数组列表,并在新轴上连接它们。

In [308]: np.stack(arr)
Out[308]: 
array([[ 0,  1,  2],
       [ 1,  2,  3],
       [10, 11, 12]])

12
缩短 @hpauli 的答案:
your_2d_arry = np.stack(arr_of_arr_object)

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