Python 将数组的numpy数组转换为一个完整的numpy数组

Python 将数组的numpy数组转换为一个完整的numpy数组,python,arrays,numpy,Python,Arrays,Numpy,我想把我的数组变成一个数组。 例如: array([ array([[0, 0, 0, ..., 1, 0, 0], [0, 1, 0, ..., 0, 0, 0], [0, 0, 0, ..., 2, 0, 0], ..., array([[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 8, 0, 2], ...,

我想把我的数组变成一个数组。 例如:

array([ array([[0, 0, 0, ..., 1, 0, 0],
       [0, 1, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 2, 0, 0],
       ..., 
       array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 8, 0, 2],
       ..., 
       [0, 0, 0, ..., 0, 0, 0],
       [1, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 1, 0, 0]], dtype=uint8)], dtype=object)
其大小(10,)仅与大小为(10518,32)的3D numpy阵列相同


我尝试将所有内容转换为列表,然后执行np.asarray,还尝试将所有内容定义为相同的dtype=uint8,但我无法将其转换为3D表单。

一种方法是分配目标数组并将对象作为循环复制

import numpy as np

x = np.array([ np.array([[0, 0, 0, 1, 0, 0],
                         [0, 1, 0, 0, 0, 0],
                         [0, 0, 3, 7, 0, 0],
                         [0, 0, 0, 2, 0, 0]], dtype=np.uint8),
               np.array([[0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0],
                         [0, 0, 4, 8, 0, 0],
                         [0, 0, 0, 8, 0, 2]], dtype=np.uint8),
               np.array([[0, 0, 0, 0, 0, 0],
                         [1, 0, 0, 0, 0, 0],
                         [0, 0, 5, 9, 0, 0],
                         [0, 0, 0, 1, 0, 0]], dtype=np.uint8)], dtype=object)

print len(x)

print x[0].shape

y=np.zeros([len(x),x[0].shape[0],x[0].shape[1]],dtype=np.uint8)

print y.shape

for i in range(len(x)):
    y[i,:,:] = x[i]

print y
如果我理解你的要求,这是期望的结果:

3
(4L, 6L)
(3L, 4L, 6L)
[[[0 0 0 1 0 0]
  [0 1 0 0 0 0]
  [0 0 3 7 0 0]
  [0 0 0 2 0 0]]

 [[0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 4 8 0 0]
  [0 0 0 8 0 2]]

 [[0 0 0 0 0 0]
  [1 0 0 0 0 0]
  [0 0 5 9 0 0]
  [0 0 0 1 0 0]]]

np.concatenate
应该可以做到:

创建由数组组成的对象数组:

In [23]: arr=np.empty((4,),dtype=object)
In [24]: for i in range(4):arr[i]=np.ones((2,2),int)*i
In [25]: arr
Out[25]: 
array([array([[0, 0],
       [0, 0]]), array([[1, 1],
       [1, 1]]),
       array([[2, 2],
       [2, 2]]), array([[3, 3],
       [3, 3]])], dtype=object)

In [28]: np.concatenate(arr)
Out[28]: 
array([[0, 0],
       [0, 0],
       [1, 1],
       [1, 1],
       [2, 2],
       [2, 2],
       [3, 3],
       [3, 3]])
或通过重塑:

In [26]: np.concatenate(arr).reshape(4,2,2)
Out[26]: 
array([[[0, 0],
        [0, 0]],

       [[1, 1],
        [1, 1]],

       [[2, 2],
        [2, 2]],

       [[3, 3],
        [3, 3]]])
In [27]: _.shape
Out[27]: (4, 2, 2)
串联
有效地将其输入视为数组列表。因此,无论这是对象数组、列表还是三维数组,它都可以工作

这不能简单地通过重塑来实现
arr
是一个指针数组-指向内存中其他位置的数组。要获得单个3d阵列,必须将所有片段复制到一个缓冲区中。这就是concatenate所做的——它创建一个大的空文件,并复制每个数组,但它是在编译代码中完成的


np.array
不会更改它:

In [37]: np.array(arr).shape
Out[37]: (4,)
但是将
arr
视为数组列表确实有效(但比
串联版本慢-数组更能分析其输入)


我也遇到过同样的问题,即从每一行都包含一个数组的Pandas数据帧中提取一列:

joined["ground truth"].values
# outputs
array([array([0, 0, 0, 0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0, 0, 0, 0]),
       array([0, 0, 0, 0, 0, 0, 0, 0]), ...,
       array([0, 0, 0, 0, 0, 0, 0, 0]), array([0, 0, 0, 0, 0, 0, 0, 0]),
       array([0, 0, 0, 0, 0, 0, 0, 0])], dtype=object)

np.concatenate
没有帮助,因为它将数组合并到一个平面数组中(与
np.hstack
相同)。相反,我需要用
np.vstack
垂直堆叠它们:

array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]])

也许派对迟到了,但我认为最有效的方法是:

np.array(arr.tolist())

要了解其工作原理,请执行以下操作:

import numpy as np


N, M, K = 4, 3, 2
arr = np.empty((N,), dtype=object)
for i in range(N):
    arr[i] = np.full((M, K), i)


print(arr)
# [array([[0, 0],
#        [0, 0],
#        [0, 0]])
#  array([[1, 1],
#        [1, 1],
#        [1, 1]])
#  array([[2, 2],
#        [2, 2],
#        [2, 2]])
#  array([[3, 3],
#        [3, 3],
#        [3, 3]])]


new_arr = np.array(arr.tolist())
print(new_arr)
# [[[0 0]
#   [0 0]
#   [0 0]]

#  [[1 1]
#   [1 1]
#   [1 1]]

#  [[2 2]
#   [2 2]
#   [2 2]]

#  [[3 3]
#   [3 3]
#   [3 3]]]
…以及时间安排:

%timeit np.array(arr.tolist())
# 100000 loops, best of 3: 2.48 µs per loop
%timeit np.concatenate(arr).reshape(N, M, K)
# 100000 loops, best of 3: 3.28 µs per loop
%timeit np.array([x for x in arr])
# 100000 loops, best of 3: 3.32 µs per loop

这看起来像是应该在上游解决问题的情况。为什么会有数组的数组?这从一开始就应该是一个单一的3D数组。我同意第一条评论,但您也可以使用np.array.tolist()进行列表理解。类似于np.array(my_数组中的arr的arr.tolist())的东西,np.reforme()在这里可能没有用处吗?请您发布一个我们可以运行的示例,比如使用(2,4,3)数组?如果我键入我认为是您示例的一个小版本,我不会得到一个形状(10,)。您确定,所有包含的数组都具有相同的形状吗?
[x for x in arr]
应替换为
arr.tolist()
。这将导致比
np.concatenate()
@norok2更快的代码,我看不到时间上的一致性差异。
import numpy as np


N, M, K = 4, 3, 2
arr = np.empty((N,), dtype=object)
for i in range(N):
    arr[i] = np.full((M, K), i)


print(arr)
# [array([[0, 0],
#        [0, 0],
#        [0, 0]])
#  array([[1, 1],
#        [1, 1],
#        [1, 1]])
#  array([[2, 2],
#        [2, 2],
#        [2, 2]])
#  array([[3, 3],
#        [3, 3],
#        [3, 3]])]


new_arr = np.array(arr.tolist())
print(new_arr)
# [[[0 0]
#   [0 0]
#   [0 0]]

#  [[1 1]
#   [1 1]
#   [1 1]]

#  [[2 2]
#   [2 2]
#   [2 2]]

#  [[3 3]
#   [3 3]
#   [3 3]]]
%timeit np.array(arr.tolist())
# 100000 loops, best of 3: 2.48 µs per loop
%timeit np.concatenate(arr).reshape(N, M, K)
# 100000 loops, best of 3: 3.28 µs per loop
%timeit np.array([x for x in arr])
# 100000 loops, best of 3: 3.32 µs per loop