以列表形式组织的二维nd.array列的操作

时间:2018-06-21 14:30:26

标签: python numpy list-comprehension

我有一个列表,其中的条目是numpy数组(在这种情况下为2D)。 示例数据:

   x=list([np.array([[1,2,3],[11,12,13],[111,112,113]]),np.array([[4,5,6],[14,15,16],[114,115,116],[1114,1115,1116]]),np.array([[11,12,13],[111,112,113]]),np.array([[7,8,9],[17,18,19],[117,118,119],[1117,1118,1119]])])

我想在每个numpy数组的 每一列上执行函数。有些功能内置了 axis 命令,而有些则没有,例如 MinMaxScaler

到目前为止,我已经创建了此列表理解:

   from sklearn.preprocessing import MinMaxScaler
   scaler = MinMaxScaler(feature_range=(0, 1))
   Data=list()
   Data=[[(scaler.fit_transform(np.reshape(x[i][:,j],(-1,1)))) for j in range(x[i].shape[1])] for i in range(len(x))]     

这里的问题是列表理解会创建一个新列表,每个迭代具有一个1D-numpy数组。

我尝试使用hstack并遍历整个列表长度。

   Data=list()
   L=list(range(len(x)))
   for k in range(len(x)):
          L[k]=np.zeros([x[k].shape[0],x[k].shape[1]])

   Data=[[np.hstack((L[i],scaler.fit_transform(np.reshape(x[i][:,j],(-1,1))))) for j in range(x[i].shape[1])] for i in range(len(x))]   

但是那根本行不通。当然,它会堆叠在 L 中现有零的顶部,并且每次迭代都会创建另一个列表。

L 的其他启动均不起作用,即使这不是主要问题:

   L=list() #IndexError: list index out of range
   L=list(None)*len(x) #TypeError: 'NoneType' object is not iterable
   L=list(range(len(x))) #ValueError: all the input arrays must have same number of dimensions
   #...and others tried

有人知道如何解决这个问题吗?还是我必须使用经典的for循环来做到这一点?

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

这应该可以工作(如果我理解正确的话)

def f(column):
    ... # function you want to apply to each column

data = [f(column) for matrix in x for column in matrix.T]

这是一个双for循环,等效于(但比它快)

data = []
for matrix in x:  # iterate through every matrix in the list
    for column in matrix.transpose():  # iterate through every column in the matrix
        data.append(f(column))

答案 1 :(得分:0)

使用您的x(感谢您进行剪切粘贴操作):

In [291]:  x=list([np.array([[1,2,3],[11,12,13],[111,112,113]]),np.array([[4,5,6
     ...: ],[14,15,16],[114,115,116],[1114,1115,1116]]),np.array([[11,12,13],[11
     ...: 1,112,113]]),np.array([[7,8,9],[17,18,19],[117,118,119],[1117,1118,111
     ...: 9]])])
In [292]: x
Out[292]: 
[array([[  1,   2,   3],
        [ 11,  12,  13],
        [111, 112, 113]]), array([[   4,    5,    6],
        [  14,   15,   16],
        [ 114,  115,  116],
        [1114, 1115, 1116]]), array([[ 11,  12,  13],
        [111, 112, 113]]), array([[   7,    8,    9],
        [  17,   18,   19],
        [ 117,  118,  119],
        [1117, 1118, 1119]])]
In [293]: len(x)
Out[293]: 4
In [294]: [i.shape for i in x]
Out[294]: [(3, 3), (4, 3), (2, 3), (4, 3)]

我还没有尝试摘要您要进行的处理,但是由于数组的形状不同,因此我看不到如何避免分别处理每个数组。它们不能组合成任何类型的高维数组。

我不会尝试应用fit.transform,但是显然Data是列表列表。我不知道这些内部列表包含什么。

如果仅用x列表中的一个元素来描述问题(可能是简化的形式),可能会有所帮助。我更喜欢运行一个具体的示例,并在我自己的Python会话中查看结果数组和列表。单词描述还不够清楚。

答案 2 :(得分:0)

我找到了答案。它可能不是最性感的作品。如果有人可以通过列表理解将其转换为更Python化的方式,将不胜感激,但并非必须。

使用x:

   x=list([np.array([[1,2,3],[11,12,13],[111,112,113]]),np.array([[4,5,6],[14,15,16],[114,115,116],[1114,1115,1116]]),np.array([[11,12,13],[111,112,113]]),np.array([[7,8,9],[17,18,19],[117,118,119],[1117,1118,1119]])])

具有功能的版本,可以互换:

   def theFunction(values,f):
           values=f.fit_transform(np.reshape(values,(-1,1)))
           return values

   from sklearn.preprocessing import MinMaxScaler
   scaler = MinMaxScaler(feature_range=(0, 1)) #define function 
   data =[0]*len(Neonate)

   for matrix,i in zip(x,range(len(x))):  # iterate through every matrix in the list           
       for column in matrix.transpose():  # iterate through every column in the matrix
           col=theFunction(column,scaler) 
           if 'Matrx' in locals():
                  Matrx=np.hstack((Matrx,col)) 
           else:
                  Matrx=col  
       data[i]=Matrx 
       del Matrx

没有函数,您可以在其中定义要执行的操作:

   from sklearn.preprocessing import MinMaxScaler    
   scaler = MinMaxScaler(feature_range=(0, 1)) #define function 
   data =[0]*len(Neonate)

   for matrix,i in zip(x,range(len(x))):  # iterate through every matrix in the list           
       for column in matrix.transpose():  # iterate through every column in the matrix
           col=scaler.fit_transform(np.reshape(column,(-1,1)))
           if 'Matrx' in locals():
                  Matrx=np.hstack((Matrx,col)) 
           else:
                  Matrx=col  
       data[i]=Matrx 
       del Matrx              
   return babies, AnnotMatrix_each_patient, FeatureMatrix_each_patient_all