微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从填充零的 3 维 numpy 数组创建 4 维 numpy 数组?

如何解决如何从填充零的 3 维 numpy 数组创建 4 维 numpy 数组?

问题

创建一个更高维度的 NumPy 数组,在新维度上为零

详情

分析最后一个维度,结果类似这样:

(不是实际代码,只是一个教学示例)

a.shape = (100,2,10) 
a[0,0]=1
a[0,1]=2  
...
a[0,9]=10

b.shape = (100,10,10)
b[0,:]=[0,1]
b[0,1,1] 
b[0,3,1]
...
b[0,:]=[10,9,8,7,6,5,4,1] 
    
a -> b 

目标是从a转变为b。问题是它不仅用零填充,而且与原始数组有顺序组合。

更简单的问题,以便更好地理解

另一种可视化方法是使用低维数组:

我们有这个:

a = [1,2]

我想要这个:

b = [[0,1],[2,1]]

使用 NumPy 数组并避免长循环。

2d 到 3d 案例

我们有这个:

a = [[1,3],[4,6],[7,9]]

我想要这个:

b[0] = [[0,[0,[3,1]]
b[1] = [[0,4],[6,4]]
b[2] = [[0,7],[9,7]]

我觉得对于 4 维问题,只有 10 次迭代的 for 循环就足够了。

解决方法

numpy的框架中尝试这样的事情:

import numpy as np

# create transformation tensors
N = a.shape[-1]
sigma1 = np.zeros((N,N,N))
sigma2 = np.zeros((N,N))
E = np.ones((N,N))
for i in range(N):
   sigma1[...,i] = np.diag(np.diag(E,N-1-i),N-1-i)
   sigma2[N-1-i,N-1-i:,i] = 1

b1 = np.tensordot(a,sigma1,axes=([-1],[0]))
b2 = np.tensordot(a,sigma2,[0]))

其中 sigma1,sigma2 是转换张量,您可以根据需要转换与 a 的最后一个维度相关联的数据(您在问题中提到的两个版本和评论)。这里的循环仅用于创建变换张量。

对于 a = [[1,2,3],[1,3]],第一个算法给出:

[[[0. 0. 1.] [0. 1. 2.] [1. 2. 3.]] [[0. 0. 4.] [0. 4. 5.] [4. 5. 6.]] [[0. 0. 7.] [0. 7. 8.] [7. 8. 9.]]]

最后一个算法给出:

[[[0. 0. 1.] [0. 2. 1.] [3. 2. 1.]] [[0. 0. 4.] [0. 5. 4.] [6. 5. 4.]] [[0. 0. 7.] [0. 8. 7.] [9. 8. 7.]]]

在使用 numpy 时尽量避免列表和循环,因为它们会降低执行速度。

,

我能够解决问题,但可能有更有效的方法:

a = np.array([[1,[4,5,6],[7,8,9]]) #two  dim case

a = np.array([[[1,9]],[[1,9]]])# three dim case

def increase_dim(arr):
    stack_list = []
    stack_list.append(arr)
    for i in range(1,arr.shape[-1]):
       stack_list.append(np.delete(np.delete(np.append(np.zeros(arr.shape),arr,axis=-1),np.s_[-i:],axis = len(arr.shape)-1),np.s_[:arr.shape[-1]-i],axis = -1))    
    return np.stack(stack_list,axis = -1)

b = increase_dim(b)

我希望这可以帮助理解问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。