这是一种有效或正确的方法,可以将每列中的每个单元格除以表格中该列的最大值吗?是否有更好的实施(如果这是正确的)? 注意:所有值> gt = = 0
new_data = [];
for row in np.transpose(data)[1::]: #from 1 till end
for elements in row:
if sum(elements) != 0:
new_data.append(elements/max(row));
else:
new_data.append(0);
new_data = np.transpose(new_data);
现在:
id col1 col2 col3 col4
A 2 1 4 0
B 3 8 2 0
C 2 3 0 0
D 5 5 3 0
E 6 3 3 0
必需:
id col1 col2 col3 col4
A 1/3 1/8 1 0
B 1/2 1 1/2 0
C 1/3 3/8 0 0
D 5/6 5/8 3/4 0
E 1 3/8 3/4 0
答案 0 :(得分:4)
你如何处理0
?像最后一栏一样?理论上它应该是nan
。 (sum(elements) != 0
,如果是-1 -1 0 1 2怎么办?那应该是-1 -0.5 0 0.5 1,对吗?)
In [138]:
A*1./np.max(A, axis=0)
Out[138]:
array([[ 0.33333333, 0.125 , 1. , nan],
[ 0.5 , 1. , 0.5 , nan],
[ 0.33333333, 0.375 , 0. , nan],
[ 0.83333333, 0.625 , 0.75 , nan],
[ 1. , 0.375 , 0.75 , nan]])
我们可以保留最后一栏。
In [141]:
np.where(np.max(A, axis=0)==0, A, A*1./np.max(A, axis=0))
Out[141]:
array([[ 0.33333333, 0.125 , 1. , 0. ],
[ 0.5 , 1. , 0.5 , 0. ],
[ 0.33333333, 0.375 , 0. , 0. ],
[ 0.83333333, 0.625 , 0.75 , 0. ],
[ 1. , 0.375 , 0.75 , 0. ]])
使用循环执行此操作的正确方法是:
for row in A.T:
if max(row)>0:
new_data.append([item*1./max(row) for item in row])
else:
new_data.append(row)
答案 1 :(得分:2)
嗯,另一种方法(使用 numpy ):
import numpy as np
M / (M.max(axis=0) + np.spacing(0))
技巧是使用一个小的或无穷小的数字“ np.spacing(0)(在Python中)”以避免除0/0。在MATLAB中,例如 eps 。
作为一项功能将是:
但是,如果我们想要在每一行中按最大值进行除法会怎样?
密钥:转置在Numpy中: .transpose()或 .T
使用定义的上一个数组 M ,函数 fun1 将是: