假设我有这个包含相同长度列表的对象数组:
>>> a = np.empty(2, dtype=object)
>>> a[0] = [1, 2, 3, 4]
>>> a[1] = [5, 6, 7, 8]
>>> a
array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object)
如何将其转换为数字2D数组?
>>> a.shape
(2,)
>>> b = WHAT_GOES_HERE(a)
>>> b
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
>>> b.shape
(2, 4)
我该如何反过来?
如果我的a
数组是np.array
np.array
,而不是np.array
list
,那么它会变得更容易吗?< / p>
>>> na = np.empty(2, dtype=object)
>>> na[0] = np.array([1, 2, 3, 4])
>>> na[1] = np.array([5, 6, 7, 8])
>>> na
array([array([1, 2, 3, 4]), ([5, 6, 7, 8])], dtype=object)
答案 0 :(得分:3)
使用np.concatenate
-
b = np.concatenate(a).reshape(len(a),*np.shape(a[0]))
@Eric
使用*np.shape(a[0])
的改进建议应该使其适用于通用ND
形状。
示例运行 -
In [183]: a
Out[183]: array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object)
In [184]: a.shape
Out[184]: (2,)
In [185]: b = np.concatenate(a).reshape(len(a),*np.shape(a[0]))
In [186]: b
Out[186]:
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
In [187]: b.shape
Out[187]: (2, 4)
要回到a
,似乎我们可以使用两步流程,就像这样 -
a_back = np.empty(b.shape[0], dtype=object)
a_back[:] = b.tolist()
示例运行 -
In [190]: a_back = np.empty(b.shape[0], dtype=object)
...: a_back[:] = b.tolist()
...:
In [191]: a_back
Out[191]: array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object)
In [192]: a_back.shape
Out[192]: (2,)
答案 1 :(得分:1)
你可以使用np.vstack():
>>> a = np.vstack(a).astype(int)
答案 2 :(得分:0)
这是一种将源NumPy数组转换为列表然后转换为所需NumPy数组的方法:
b = np.array([k for k in a])
b
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
c = np.array([k for k in b], dtype=object)
c
array([[1, 2, 3, 4],
[5, 6, 7, 8]], dtype=object)
答案 3 :(得分:0)
我发现使用list
对np.array(list(a))
进行往返就足够了。
这似乎等同于使用np.stack(a)
。
这两种方法都有利于将一维ND阵列数组转换为(N + 1)D阵列的更一般情况。