我有一个这样的numpy.array
[[1,2,3]
[4,5,6]
[7,8,9]]
我怎样才能把它改成这个:-
[[[1,0], [2,0], [3,0]]
[[4,0], [5,0], [6,0]]
[[7,0], [8,0], [9,0]]]
提前谢谢。
使用a
作为输入数组,您可以使用array-assignment
,这将适用于通用n-dim
输入 -
out = np.zeros(a.shape+(2,),dtype=a.dtype)
out[...,0] = a
示例运行 -
In [81]: a
Out[81]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [82]: out = np.zeros(a.shape+(2,),dtype=a.dtype)
...: out[...,0] = a
In [83]: out
Out[83]:
array([[[1, 0],
[2, 0],
[3, 0]],
[[4, 0],
[5, 0],
[6, 0]],
[[7, 0],
[8, 0],
[9, 0]]])
如果你玩broadcasting
,这里有一个紧凑的——
a[...,None]*[1,0]
我认为numpy.dstack可能会提供解决方案。我们称 A 为第一个数组。做
B = np.zeros((3,3))
R = np.dstack((A,B))
R 应该是你想要的数组。
如果你的输入是无符号整数,并且你的dtype"足够大",你可以使用以下代码来填充零,而不创建副本:
b = str(a.dtype).split('int')
b = a[...,None].view(b[0]+'int'+str(int(b[1])//2))
a
等于您的示例时,输出如下所示
array([[[1, 0],
[2, 0],
[3, 0]],
[[4, 0],
[5, 0],
[6, 0]],
[[7, 0],
[8, 0],
[9, 0]]], dtype=int16)
免责声明:这个速度很快(对于大型操作数(,但非常不合理。此外,它仅适用于 32 或 64 位 dtype。不要在严肃的代码中使用。
def squeeze_in_zero(a):
sh = a.shape
n = a.dtype.itemsize
return a.view(f'f{n}').astype(f'c{2*n}').view(a.dtype).reshape(*a.shape, 2)
在我的机器上,速度为 10000 个元素,它与 @Divakar 的数组分配大致相当。下面是慢,上面是更快的。
示例运行:
>>> a = np.arange(-4, 5).reshape(3, 3)
>>> squeeze_in_zero(a)
array([[[-4, 0],
[-3, 0],
[-2, 0]],
[[-1, 0],
[ 0, 0],
[ 1, 0]],
[[ 2, 0],
[ 3, 0],
[ 4, 0]]])