【发布时间】:2011-11-14 09:33:39
【问题描述】:
我有一个形状为 (x, y) 的 2d 数组,我想将其转换为形状为 (x, y, 1) 的 3d 数组。有没有很好的 Pythonic 方式来做到这一点?
【问题讨论】:
标签: python multidimensional-array numpy
我有一个形状为 (x, y) 的 2d 数组,我想将其转换为形状为 (x, y, 1) 的 3d 数组。有没有很好的 Pythonic 方式来做到这一点?
【问题讨论】:
标签: python multidimensional-array numpy
简单的方法,有一些数学运算
首先你知道数组元素的数量,比如说 100 然后将 100 分为 3 个步骤,例如:
25 * 2 * 2 = 100
或:4 * 5 * 5 = 100
import numpy as np
D = np.arange(100)
# change to 3d by division of 100 for 3 steps 100 = 25 * 2 * 2
D3 = D.reshape(2,2,25) # 25*2*2 = 100
另一种方式:
another_3D = D.reshape(4,5,5)
print(another_3D.ndim)
到 4D:
D4 = D.reshape(2,2,5,5)
print(D4.ndim)
【讨论】:
你可以通过重塑来做到这一点
例如,您有一个形状为 35 x 750(二维)的数组 A,您可以使用 A.reshape(35, 25, 30) 将形状更改为 35 x 25 x 30(三维)
更多在文档here
【讨论】:
如果您只想将第三轴 (x,y) 添加到 (x,y,1),Numpy 允许您使用 dstack 命令轻松完成此操作。
import numpy as np
a = np.eye(3) # your matrix here
b = np.dstack(a).T
您需要转置 (.T) 以将其转换为所需的 (x,y,1) 格式。
【讨论】:
import numpy as np
# create a 2D array
a = np.array([[1,2,3], [4,5,6], [1,2,3], [4,5,6],[1,2,3], [4,5,6],[1,2,3], [4,5,6]])
print(a.shape)
# shape of a = (8,3)
b = np.reshape(a, (8, 3, -1))
# changing the shape, -1 means any number which is suitable
print(b.shape)
# size of b = (8,3,1)
【讨论】:
希望这个功能可以帮助您将 2D 数组转换为 3D 数组。
Args:
x: 2darray, (n_time, n_in)
agg_num: int, number of frames to concatenate.
hop: int, number of hop frames.
Returns:
3darray, (n_blocks, agg_num, n_in)
def d_2d_to_3d(x, agg_num, hop):
# Pad to at least one block.
len_x, n_in = x.shape
if (len_x < agg_num): #not in get_matrix_data
x = np.concatenate((x, np.zeros((agg_num - len_x, n_in))))
# main 2d to 3d.
len_x = len(x)
i1 = 0
x3d = []
while (i1 + agg_num <= len_x):
x3d.append(x[i1 : i1 + agg_num])
i1 += hop
return np.array(x3d)
【讨论】:
除了其他答案,你还可以使用切片numpy.newaxis:
>>> from numpy import zeros, newaxis
>>> a = zeros((6, 8))
>>> a.shape
(6, 8)
>>> b = a[:, :, newaxis]
>>> b.shape
(6, 8, 1)
甚至这个(可以使用任意数量的维度):
>>> b = a[..., newaxis]
>>> b.shape
(6, 8, 1)
【讨论】:
numpy.newaxis 只是None。 newaxis 只是为了便于阅读。相当于只做b = a[..., None](省略号还允许它适用于 N 维数组,而不仅仅是二维数组。)
newaxis 成为 None 只是一个实现细节(因此将来可能会发生变化),但它看起来像是明确记录在案的。
a 转换为b 和b.shape = (6,8,3)?
6*8 = 48 数字。新的有6*8*3 = 144 号码。你想如何将原来的 48 个数字映射到你的新数组中?沿第三轴重复?在这种情况下,大多数时候您不必为重复而烦恼:将其保留为 shape (6, 8, 1) 并利用 NumPy 的广播能力。但如果你真的需要形状(6, 8, 3),请查看np.tile 和np.broadcast_to。
np.broadcast_to 来做到这一点,例如 b = np.broadcast_to(a[..., np.newaxis], (6, 8, 3))。
numpy.reshape(array, array.shape + (1,))
【讨论】:
A,您可以简单地分配给形状属性:A.shape = A.shape + (1,),甚至A.shape += 1,。
reshape 好吗?
np.reshape 中使用order='F' 时。如果没有指定order='F',那么在我的情况下输出是错误的
import numpy as np
a= np.eye(3)
print a.shape
b = a.reshape(3,3,1)
print b.shape
【讨论】: