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

ROB*_*WNS 4 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],
       ..., 
       [0, 0, 0, ..., 0, 0, 0],
       [1, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 1, 0, 0]], dtype=uint8)], dtype=object)
Run Code Online (Sandbox Code Playgroud)

它的大小(10,)只是3D numpy数组的大小(10,518,32)

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]]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)

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

hpa*_*ulj 11

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]])
Run Code Online (Sandbox Code Playgroud)

或者重塑:

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)
Run Code Online (Sandbox Code Playgroud)

concatenate有效地将其输入视为数组列表.因此无论是对象数组,列表还是3d数组,它都可以工作.

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


np.array 不改变它:

In [37]: np.array(arr).shape
Out[37]: (4,)
Run Code Online (Sandbox Code Playgroud)

但是arr作为数组列表处理确实有效(但比concatenate版本慢- 数组分析其输入更多).

In [38]: np.array([x for x in arr]).shape
Out[38]: (4, 2, 2)
Run Code Online (Sandbox Code Playgroud)


nor*_*ok2 6

也许来晚了,但我相信最有效的方法是:

\n
np.array(arr.tolist())\n
Run Code Online (Sandbox Code Playgroud)\n
\n

给出一些关于它如何工作的想法:

\n
import numpy as np\n\n\nN, M, K = 4, 3, 2\narr = np.empty((N,), dtype=object)\nfor i in range(N):\n    arr[i] = np.full((M, K), i)\n\n\nprint(arr)\n# [array([[0, 0],\n#        [0, 0],\n#        [0, 0]])\n#  array([[1, 1],\n#        [1, 1],\n#        [1, 1]])\n#  array([[2, 2],\n#        [2, 2],\n#        [2, 2]])\n#  array([[3, 3],\n#        [3, 3],\n#        [3, 3]])]\n\n\nnew_arr = np.array(arr.tolist())\nprint(new_arr)\n# [[[0 0]\n#   [0 0]\n#   [0 0]]\n\n#  [[1 1]\n#   [1 1]\n#   [1 1]]\n\n#  [[2 2]\n#   [2 2]\n#   [2 2]]\n\n#  [[3 3]\n#   [3 3]\n#   [3 3]]]\n
Run Code Online (Sandbox Code Playgroud)\n

...以及时间安排:

\n
%timeit np.array(arr.tolist())\n# 100000 loops, best of 3: 2.48 \xc2\xb5s per loop\n%timeit np.concatenate(arr).reshape(N, M, K)\n# 100000 loops, best of 3: 3.28 \xc2\xb5s per loop\n%timeit np.array([x for x in arr])\n# 100000 loops, best of 3: 3.32 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n


小智 0

一种方法是分配目标数组并以循环方式复制对象。

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
Run Code Online (Sandbox Code Playgroud)

如果我明白你在问什么,这就是期望的结果:

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]]]
Run Code Online (Sandbox Code Playgroud)