我有一个熊猫系列features
,其值如下(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)
。
如何将其识别为2d而不是将数组作为值的1d数组。还有为什么它不自动将其检测为二维数组?
答案 0 :(得分:3)
为回答您的评论问题,让我们比较两种创建数组的方法
首先从数组列表(长度相同)中创建一个数组:
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
的默认行为是在可以的地方创建一个多维数组。
要解决这个问题需要花费额外的精力。同样,要撤消该操作也需要付出额外的努力-创建2d数字数组。
仅对其调用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。 stack
将其视为数组列表,并在新轴上联接。
In [308]: np.stack(arr)
Out[308]:
array([[ 0, 1, 2],
[ 1, 2, 3],
[10, 11, 12]])