我有一个numpy数组,形状像
a1.shape
# 1000
a1[0].shape
# (100, 100, 3)
我想以
的方式改变形状a1.shape
# (1000, 100, 100, 3)
我怎样才能做到这一点?
答案 0 :(得分:0)
只需发布解决方案以防任何人需要
x = []
for fname in fl1:
x.append( np.array(Image.open(fname)))
for i in range(0, len(x)):
x[i] = imresize(x[i], [100,100], interp='bilinear')
y = np.array(x)
y.shape
答案 1 :(得分:0)
列出具有不同形状(但元素数量相同)的数组:
In [72]: alist = [np.ones((2,3),int),np.zeros(6,int),np.arange(6)]
In [73]: alist
Out[73]:
[array([[1, 1, 1],
[1, 1, 1]]), array([0, 0, 0, 0, 0, 0]), array([0, 1, 2, 3, 4, 5])]
In [74]: np.array(alist)
Out[74]:
array([array([[1, 1, 1],
[1, 1, 1]]), array([0, 0, 0, 0, 0, 0]),
array([0, 1, 2, 3, 4, 5])], dtype=object)
结果是一个对象dtype数组。
但是如果我们将列表的所有元素重塑为相同的形状,我们会得到一个3d数组:
In [75]: np.array([x.reshape(2,3) for x in alist])
Out[75]:
array([[[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[0, 0, 0]],
[[0, 1, 2],
[3, 4, 5]]])
现在让我们在制作数组后尝试重塑元素:
In [76]: arr = np.array(alist)
In [77]: arr.shape
Out[77]: (3,)
In [78]: for i in range(3):
...: arr[i] = arr[i].reshape(2,3)
...:
In [79]: arr
Out[79]:
array([array([[1, 1, 1],
[1, 1, 1]]),
array([[0, 0, 0],
[0, 0, 0]]),
array([[0, 1, 2],
[3, 4, 5]])], dtype=object)
In [80]: np.array(arr)
Out[80]:
array([array([[1, 1, 1],
[1, 1, 1]]),
array([[0, 0, 0],
[0, 0, 0]]),
array([[0, 1, 2],
[3, 4, 5]])], dtype=object)
在该阵列上调用array
不会改变任何内容。
但是stack
确实有用(stack
只是concatenate
的方便版本):
In [82]: np.stack(arr)
Out[82]:
array([[[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[0, 0, 0]],
[[0, 1, 2],
[3, 4, 5]]])
stack
获取数组列表,或者它是一个数组,迭代第一维:
In [83]: np.stack([x for x in arr])
Out[83]:
array([[[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[0, 0, 0]],
[[0, 1, 2],
[3, 4, 5]]])