我有一个28 x 1875的numpy数组。每个元素都是一个3元素列表(只有浮点数)。我需要将这些元素中的每一个分成单独的元素,以获得28x5625(1875 * 3)形状的数组。我已经尝试了np.split
,但它只分隔每个元素,但没有每个子元素。有没有快速的方法来做到这一点?
答案 0 :(得分:2)
制作2d列表:
In [522]: arr = np.empty(6,object)
In [523]: arr[:] = [list(range(i,i+3)) for i in range(6)]
In [524]: arr = arr.reshape(2,3)
In [525]: arr
Out[525]:
array([[list([0, 1, 2]), list([1, 2, 3]), list([2, 3, 4])],
[list([3, 4, 5]), list([4, 5, 6]), list([5, 6, 7])]], dtype=object)
如果它是1d,填充这样的数组会更容易,这就是为什么我从(6,)开始并重新整形后的原因。
Paul Panzer的建议:
In [526]: np.array(arr.tolist())
Out[526]:
array([[[0, 1, 2],
[1, 2, 3],
[2, 3, 4]],
[[3, 4, 5],
[4, 5, 6],
[5, 6, 7]]])
In [527]: _.reshape(2,-1)
Out[527]:
array([[0, 1, 2, 1, 2, 3, 2, 3, 4],
[3, 4, 5, 4, 5, 6, 5, 6, 7]])
您还可以使用np.stack
(np.concatenate
的版本)来创建数组。但它确实需要1d对象数组 - 因此ravel
:
In [536]: np.stack(arr.ravel())
Out[536]:
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6],
[5, 6, 7]])
可以根据需要重新塑造:
In [537]: np.stack(arr.ravel()).reshape(2,-1)
Out[537]:
array([[0, 1, 2, 1, 2, 3, 2, 3, 4],
[3, 4, 5, 4, 5, 6, 5, 6, 7]])
在某些情况下,我们需要transpose
轴来获得所需的顺序。