如何从填充零的 3 维 numpy 数组创建 4 维 numpy 数组?
How to create a 4 dimensional numpy array from a 3 dimensional numpy array filling with zeros?
问题
创建一个更高维度的 NumPy 数组,在新维度上使用零
详情
分析最后一个维度,结果类似这样:
(不是实际代码,只是一个教学示例)
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
objective就是从a
变成b
。问题是它不仅用零填充,而且与原始数组有顺序组合。
更简单的问题以便更好地理解
另一种可视化方法是使用低维数组:
我们有这个:
a = [1,2]
我想要这个:
b = [[0,1],[2,1]]
使用 NumPy 数组并避免长循环。
2d 到 3d 案例
我们有这个:
a = [[1,2,3],[4,5,6],[7,8,9]]
我想要这个:
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]]
我觉得4维问题只用一个for循环10次就够了
在 numpy
:
的框架下尝试这样的事情
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]))
其中 sigma1
、sigma2
是转换张量,您可以根据需要转换与 a
最后一个维度关联的数据(您在问题和意见)。这里的循环仅用于创建变换张量。
对于a = [[1,2,3],[1,2,3],[1,2,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,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)
希望对问题的理解有所帮助
问题
创建一个更高维度的 NumPy 数组,在新维度上使用零
详情
分析最后一个维度,结果类似这样:
(不是实际代码,只是一个教学示例)
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
objective就是从a
变成b
。问题是它不仅用零填充,而且与原始数组有顺序组合。
更简单的问题以便更好地理解
另一种可视化方法是使用低维数组:
我们有这个:
a = [1,2]
我想要这个:
b = [[0,1],[2,1]]
使用 NumPy 数组并避免长循环。
2d 到 3d 案例
我们有这个:
a = [[1,2,3],[4,5,6],[7,8,9]]
我想要这个:
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]]
我觉得4维问题只用一个for循环10次就够了
在 numpy
:
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]))
其中 sigma1
、sigma2
是转换张量,您可以根据需要转换与 a
最后一个维度关联的数据(您在问题和意见)。这里的循环仅用于创建变换张量。
对于a = [[1,2,3],[1,2,3],[1,2,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,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)
希望对问题的理解有所帮助