如何在Python中将一个数组的数组转换为多维数组?

5
我有一个长度为X的NumPy数组,其中每个数组的长度都相同(为Y),但其类型为“object”,因此具有维度(X,)。我想将其“转换”为一个维度为(X,Y)且成员数组元素类型为“float”的数组。
我唯一能想到的方法是使用类似以下的“手动”方式:
[x for x in my_array]

你是否有更好的习语来完成这种“转换”?


例如,我有一个类似以下内容的东西:

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

该数组的形状为 (X,) 而不是 (X, 10)。


你最开始是怎么得到这个数组的?通常这种情况意味着你在程序早期就出了问题。我怀疑子数组的长度并不相同。 - user2357112
np.transpose(your_array).astype(float) - Mr_U4913
@Mr_U4913: "ValueError: 用序列设置数组元素" - orome
@user2357112:子数组的长度确实相同。@user2357112:我从一个包含[X个数组列表]的列表开始(https://stackoverflow.com/q/45361118/656912),其中一个列表中的所有数组的长度为Y,然后我对其进行转置(出于许多原因),并使用例如`[:,1]`进行切片,这会产生问题结构。 - orome
@raxacoricofallapatorius:那肯定是你在里面做错了什么。也许是转置的问题。 - user2357112
1个回答

3
您可以在新轴上连接数组。例如:
In [1]: a=np.array([1,2,3],dtype=object)
   ...: b=np.array([4,5,6],dtype=object)

要创建一个数组的数组,我们不能像被删除的答案那样只是使用 array 来组合它们:
In [2]: l=np.array([a,b])
In [3]: l
Out[3]: 
array([[1, 2, 3],
       [4, 5, 6]], dtype=object)
In [4]: l.shape
Out[4]: (2, 3)

相反,我们需要创建一个正确形状的空数组,并填充它:

In [5]: arr = np.empty((2,), object)
In [6]: arr[:]=[a,b]
In [7]: arr
Out[7]: array([array([1, 2, 3], dtype=object), 
               array([4, 5, 6], dtype=object)], 
              dtype=object)

np.stack 的作用类似于 np.array,但使用的是 concatenate

In [8]: np.stack(arr)
Out[8]: 
array([[1, 2, 3],
       [4, 5, 6]], dtype=object)
In [9]: _.astype(float)
Out[9]: 
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

我们还可以使用concatenatehstackvstack在不同的轴上组合数组。它们都将数组的数组视为数组列表。
如果arr是2d(或更高级别),我们必须先ravel它。

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