首页 > 解决方案 > 从python中的一维数组创建矩阵数组

问题描述

当元素在python中被视为一维数组时,您能否帮助创建一个矩阵数组。

例如:这是我想要做的

import numpy as np

ele_1 = np.linspace(0,1,num= 50)
ele_2 = np.linspace(1,2,num= 50)
ele_3 = np.linspace(2,3,num= 50)
ele_4 = np.linspace(3,4,num= 50)

Mat_array = np.array([[ele_1,ele_2],[ele_2,ele_4]]) #This is giving me (2, 2, 50) array


预期输出:

array([matrix_1,matrix_2,.....]

这里matrix_iarray([[ele_1[i],ele_2[i]],[ele_3[i],ele_4[i]]]) 。Mat_array 必须是(50, 2, 2,)数组

我想避免循环,这种方法也应该适用于任何适用的 nxn 矩阵。

谢谢

标签: pythonnumpy

解决方案


In [153]: ele_1 = np.linspace(0,1,num= 50) 
     ...: ele_2 = np.linspace(1,2,num= 50) 
     ...: ele_3 = np.linspace(2,3,num= 50) 
     ...: ele_4 = np.linspace(3,4,num= 50)                                              
In [154]: Mat_array = np.array([[ele_1,ele_2],[ele_3,ele_4]]) # correction?             
In [155]: Mat_array.shape                                                               
Out[155]: (2, 2, 50)

transpose可以把50放在第一位:

In [156]: Mat_array.transpose(2,0,1).shape                                              
Out[156]: (50, 2, 2)
In [157]: Mat_array = np.array([[ele_1,ele_2],[ele_3,ele_4]]).transpose(2,0,1)          
In [158]: timeit Mat_array = np.array([[ele_1,ele_2],[ele_3,ele_4]]).transpose(2,0,1)   
7.56 µs ± 51 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

np.stack在新的最后一个轴上的替代方案:

In [159]: res = np.stack([ele_1,ele_2,ele_3,ele_4],axis=1).reshape(-1,2,2)              
In [160]: np.allclose(res, Mat_array)                                                   
Out[160]: True
In [161]: timeit res = np.stack([ele_1,ele_2,ele_3,ele_4],axis=1).reshape(-1,2,2)       
16.9 µs ± 69.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

但它更慢。

S_Zizzle 的回答比较慢,尤其是在返回数组时。它迭代n次数:

In [162]: final_array = np.array([[[ele_1[i],ele_2[i]],[ele_3[i],ele_4[i]]] for i in ran
     ...: ge(n)])                                                                       
In [163]: np.allclose(final_array, Mat_array)                                           
Out[163]: True
In [164]: timeit final_array = np.array([[[ele_1[i],ele_2[i]],[ele_3[i],ele_4[i]]] for i
     ...:  in range(n)])                                                                
188 µs ± 373 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

推荐阅读