如何为NUMPY元素添加维度?



我有一个这样的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]]])

相关内容

  • 没有找到相关文章

最新更新