首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从填充零的三维numpy数组创建4维numpy数组?

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

Stack Overflow用户
提问于 2021-03-05 12:45:23
回答 2查看 1.2K关注 0票数 1

问题所在

创建具有新维度零的高维NumPy数组

详细信息

对最后一个维度进行分析,结果与以下内容相似:

(不是一个实际的代码,只是一个说教的例子)

代码语言:javascript
复制
a.shape = (100,2,10) 
a[0,0,0]=1
a[0,0,1]=2  
...
a[0,0,9]=10

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

目标是将a转换为b。问题是,不仅填充了零,而且与原始数组有一个顺序组合。

更好地理解的更简单的问题

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

我们有:

代码语言:javascript
复制
a = [1,2]

我想要这个:

代码语言:javascript
复制
b = [[0,1],[2,1]]

使用NumPy数组,避免长时间循环。

2d到3d案例

我们有:

代码语言:javascript
复制
a = [[1,2,3],[4,5,6],[7,8,9]]

我想要这个:

代码语言:javascript
复制
b[0] = [[0,0,1],[0,2,1],[3,2,1]]
b[1] = [[0,0,4],[0,5,4],[6,5,4]]
b[2] = [[0,0,7],[0,8,7],[9,8,7]]

我觉得对于四维问题,只有一个循环有10次迭代就足够了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-05 13:05:27

numpy框架中尝试这样的方法

代码语言:javascript
复制
import numpy as np

# create transformation tensors
N = a.shape[-1]
sigma1 = np.zeros((N,N,N))
sigma2 = np.zeros((N,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, axes=([-1],[0]))

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

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

[0.0。1.1.2.3.] [0。0。4.4.5.6. [0.0。7. 7. 8. 9.]

最后一种算法是:

[0.0。1.3.2.1.] [0。0。4.6.5.4.] [0。0。7. 9. 8. 7。

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

票数 1
EN

Stack Overflow用户

发布于 2021-03-05 16:07:49

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

代码语言:javascript
复制
a = np.array([[1,2,3],[4,5,6],[7,8,9]]) #two  dim case

a = np.array([[[1,2,3],[4,5,6],[7,8,9]],[[1,2,3],[4,5,6],[7,8,9]],[[1,2,3],[4,5,6],[7,8,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)

我希望这能帮助我们理解问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66492847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档