我有一个列表,其中的条目是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循环来做到这一点?
感谢您的帮助
答案 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