Python:在每列中将单元格中的值除以max

时间:2014-02-19 03:57:52

标签: python numpy

这是一种有效或正确的方法,可以将每列中的每个单元格除以表格中该列的最大值吗?是否有更好的实施(如果这是正确的)? 注意:所有值> 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

2 个答案:

答案 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

实施例

Array divided by max value per column avoiding division 0/0

作为一项功能将是:

function1

但是,如果我们想要在每一行中按最大值进行除法会怎样?

密钥:转置在Numpy中: .transpose() .T

使用定义的上一个数组 M ,函数 fun1 将是:

  1. Transpose Matrix M
  2. 使用 fun1
  3. 转置最后评估的数组
  4. Using function1 to divide by max element in each row