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)
也许来晚了,但我相信最有效的方法是:
\nnp.array(arr.tolist())\nRun Code Online (Sandbox Code Playgroud)\n给出一些关于它如何工作的想法:
\nimport 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]]]\nRun 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\nRun 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)
| 归档时间: |
|
| 查看次数: |
4206 次 |
| 最近记录: |